以下代碼來自Leetcode discussions。DFS:通過訪問,訪問和未訪問而感到困惑
public class Solution {
public boolean validTree(int n, int[][] edges) {
int[] visited = new int[n];
List<List<Integer>> adjList = new ArrayList<>();
for (int i=0; i<n; ++i) { adjList.add(new ArrayList<Integer>()); }
for (int[] edge: edges) {
adjList.get(edge[0]).add(edge[1]);
adjList.get(edge[1]).add(edge[0]);
}
if (hasCycle(-1, 0, visited, adjList)) { return false; } // has cycle
for (int v: visited) { if (v == 0) { return false; } } // not 1 single connected component
return true;
}
private boolean hasCycle(int pred, int vertex, int[] visited, List<List<Integer>> adjList) {
visited[vertex] = 1; // current vertex is being visited
for (Integer succ: adjList.get(vertex)) { // successors of current vertex
if (succ != pred) { // exclude current vertex's predecessor
if (visited[succ] == 1) { return true; } // ###back edge/loop detected!
else if (visited[succ] == 0) {
if (hasCycle(vertex, succ, visited, adjList)) { return true; }
}
}
}
visited[vertex] = 2;
return false;
}
}
我的問題是:
1,對於在DFS if (visited[succ] == 1) { return true; } // back edge/loop detected!
,我試圖visited[succ] == 1
和visited[succ] >= 1
,所有這些工作。 我很困惑``visited [succ] == 1 and
visited [succ] == 2```有什麼區別?他們可以檢測到不同類型的圈子嗎? 2,看起來如果我們用visited
存儲True和False(已訪問和未訪問),它仍然有效(從另一個Leetcode topic)。 什麼時候應該使用未訪問,訪問,訪問?什麼時候我們應該使用未訪問,並訪問?任何例子?
感謝
謝謝。對於無向圖,我們應該使用'visited [succ] == 1'來檢測圓圈。但對於有向圖,我們應該在DAG中使用'visited [succ] == 1',並且在樹中使用'visited [succ] == 2'?糾正我,如果我錯了。 – BAE
@BAE如果你正在檢測一棵樹,你應該使用'visited [succ]!= 0'來覆蓋'1'和'2'。 – dasblinkenlight