Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在无向图中寻找圈与在有向图中寻找圈_Algorithm_Graph - Fatal编程技术网

Algorithm 在无向图中寻找圈与在有向图中寻找圈

Algorithm 在无向图中寻找圈与在有向图中寻找圈,algorithm,graph,Algorithm,Graph,所以我在读Robert Sedgewick的算法第四版的书,在有向图中找到圈的方法不同于在无向图中找到圈的方法 下面是在无向图中查找循环的示例代码 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 i

所以我在读Robert Sedgewick的算法第四版的书,在有向图中找到圈的方法不同于在无向图中找到圈的方法

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

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;
   }
}
公共类循环{
公共布尔[]标记;
公共周期;
公共自行车(图G){
marked=new boolean[G.V()];//G.V()是图G中的顶点数
对于(int s=0;s

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

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


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

也许他假设在有向图中可能有一个自循环?实际上并没有假设一个自循环。我认为我刚刚发布的算法可能适用于有向图,我只是不太确定下面的答案是有意义的..谢谢,这是有意义的。刚刚想出了一个反例