无向图中循环的属性是什么?

时间:2014-05-19 19:52:38

标签: java graph

我试图理解这段代码来检测以下循环: 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);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

该算法在图形上进行深度优先搜索,并标记它遇到的任何顶点。使用先前访问的顶点(dfs)和当前访问的顶点(u)调用方法v,其中vu的后继者。如果v的下一个后继者未标记(if (!marked[w])),搜索将继续。否则我们找到了一个圆圈。

但是,如果两个方向都有一条边,则此实现将其视为圆。 wv的邻居。如果它是u本身(v的先行者),我们就有这种情况。因此代码检查这是情况(w != u),即我们是一个双向边缘,所以我们找到了一个圆圈。