Graph: Detect Cycle
Detect if any cycle exists in the graph.
无向图
0 - 1
| /
2
对于无向图,需要记录一个previous node来判断这是不是无向图两个node之间的连接。
DFS
// 0:unvisited, 1:visited, 2:visiting
public boolean hasCycle(Node root, Node prev) {
if(root.state == 2) {
return true;
}
root.state = 2;
if(adj.get(root) != null) {
for(Node node : adj.get(root)) {
if(node != prev) {
if(node.status != 1 && hasCycle(node, root)) {
return true;
}
}
}
}
root.state = 1;
return false;
}
BFS
同一层的节点会出现相连的情况。
public boolean hasCycle(Node root) {
Queue<Integer> q = new LinkedList<>();
if(root != null) q.offer(root);
root.state = 2;
while(!q.isEmpty()) {
Node cur = q.poll();
for(Node adj : adjacent.get(cur)) {
// 如果同一层的这个节点是等待访问的,说明这两个节点之间
// 有连接,所以有环的出现。
if(adj.state == 2) reture true;
if(adj.state == 0) {
q.offer(adj);
adj.state = 2;
}
}
cur.state = 1;
}
return false;
}
有向图
不需要记录previous node;
public boolean hasCycle(Node node) {
if(node.state == 2) return false;
node.state = 2;
if(map.get(node) != null) {
for(Node adj : map.get(node)) {
if(adj.state != 1 && hasCycle(adj)) {
return true;
}
}
}
node.state = 1;
return false;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。