gpt4 book ai didi

algorithm - 在无向图中查找循环与在有向图中查找循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:29:29 24 4
gpt4 key购买 nike

所以我正在阅读 Robert Sedgewick 的算法第 4 版。书和在有向图中寻找环的方法与在无向图中寻找环的方法不同。

这是在无向图中查找循环的示例代码

public class Cycle {
public boolean[] marked;
public boolean hasCycle;

public Cycle(Graph G) {
marked = new boolean[G.V()]; // G.V() is the number of vertices in the graph G
for (int s = 0; s < G.V(); ++s) {
if (!marked[s])
dfs(G, s, s);
}
}

private void dfs(Graph G, int v, int u) {
marked[v] = true;
for (int w : G.adj(v)) //iterate through vertices adjacent to v
if (!marked[w])
dfs(G, w, v)
else if (w != u) hasCycle= true;
}

public boolean hasCycle() {
return hasCycle;
}
}

但是,当尝试在有向图中查找循环时,Sedgewick 使用 bool 数组,如果在当前调用堆栈期间检查了第 i 个顶点,则该数组的第 i 个元素为真。对于检查的每个顶点 K,我们检查 bool 数组的第 K 个元素是否为真。如果是,那么我们就有了一个循环。我的问题是,为什么有必要将 bool 数组用于有向图。我刚刚列出的方法不应该更节省内存吗?这种方法是否只适用于无向图?为什么?

最佳答案

您不能使用相同的算法:上面的算法只是探索图的所有连接组件。如果你遇到一个已经标记的顶点,必须有两条不同的路径才能到达它,而在一个无向图中必须有一个循环。如果没有,您可以继续下一个连接的组件 - 无需清理刚刚完成的组件。

另一方面,如果您有一个有向图,则到同一顶点的两条不同路径不会构成环路。所以你需要一个不同的算法(例如,你可能需要清理你回溯的任何步骤。)

关于algorithm - 在无向图中查找循环与在有向图中查找循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10972028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com