我试图理解这段代码来检测以下循环: http://algs4.cs.princeton.edu/41undirected/Cycle.java.html
因此,如果未标记或找到顶点w,则继续运行dfs。如果它被发现并且它不等于你...为什么我在构造函数中传递-1?
我对其他人感到困惑,如果(w!= u)。为什么这会导致循环?
public Cycle(Graph G) {
if (hasSelfLoop(G)) return;
if (hasParallelEdges(G)) return;
marked = new boolean[G.V()];
edgeTo = new int[G.V()];
for (int v = 0; v < G.V(); v++)
if (!marked[v])
dfs(G, -1, v);
}
private void dfs(Graph G, int u, int v) {
marked[v] = true;
for (int w : G.adj(v)) {
// short circuit if cycle already found
if (cycle != null) return;
if (!marked[w]) {
edgeTo[w] = v;
dfs(G, v, w);
}
// check for cycle (but disregard reverse of edge leading to v)
else if (w != u) {
cycle = new Stack<Integer>();
for (int x = v; x != w; x = edgeTo[x]) {
cycle.push(x);
}
cycle.push(w);
cycle.push(v);
}
}
}
答案 0 :(得分:2)
该算法在图形上进行深度优先搜索,并标记它遇到的任何顶点。使用先前访问的顶点(dfs
)和当前访问的顶点(u
)调用方法v
,其中v
是u
的后继者。如果v
的下一个后继者未标记(if (!marked[w])
),搜索将继续。否则我们找到了一个圆圈。
但是,如果两个方向都有一条边,则此实现不将其视为圆。 w
是v
的邻居。如果它是u
本身(v
的先行者),我们就有这种情况。因此代码检查这是不情况(w != u
),即我们不是一个双向边缘,所以我们做找到了一个圆圈。