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 Theory_Strongly Connected Graph - Fatal编程技术网

Algorithm 如何在图中找到强连通的组件?

Algorithm 如何在图中找到强连通的组件?,algorithm,graph-theory,strongly-connected-graph,Algorithm,Graph Theory,Strongly Connected Graph,我正在自学图论,现在试图理解如何在图中找到答案。我已经阅读了关于SO的几个不同的问题/答案(例如,,,,,,),但我找不到一个完整的循序渐进的例子 根据本发明,一种方法是: 调用DFS(G)来计算每个顶点u的完成时间f[u] 计算转置(G) 调用DFS(转置(G)),但在DFS的主循环中,考虑以F[U](如步骤1中所计算)降低顺序的顶点。 将步骤3的深度优先林中每棵树的顶点作为单独的强连接组件输出 观察下面的图表(问题是3.4,我已经找到了几个解决方案,但我正在尝试将其分解并自己理解。) 步骤

我正在自学图论,现在试图理解如何在图中找到答案。我已经阅读了关于SO的几个不同的问题/答案(例如,,,,,,),但我找不到一个完整的循序渐进的例子

根据本发明,一种方法是:

  • 调用DFS(G)来计算每个顶点u的完成时间f[u]
  • 计算转置(G)
  • 调用DFS(转置(G)),但在DFS的主循环中,考虑以F[U](如步骤1中所计算)
  • 降低顺序的顶点。
  • 将步骤3的深度优先林中每棵树的顶点作为单独的强连接组件输出
  • 观察下面的图表(问题是3.4,我已经找到了几个解决方案,但我正在尝试将其分解并自己理解。)

    步骤1:调用DFS(G)计算每个顶点u的完成时间f[u

    从顶点A开始运行DFS:

    请注意格式为[参观前、参观后]的红色文本

    步骤2:计算转置(G)

    第3步。调用DFS(转置(G)),但在DFS的主循环中,考虑以F[U](如步骤1中计算)< /强>

    为顺序的顶点。 好的,所以按访问后(完成时间)值的减少顺序:

    {E,B,A,H,G,I,C,D,F,J}

    在这一步中,我们在G^T上运行DFS,但从上面列表中的每个顶点开始:

    • DFS(E):{E}
    • DFS(B):{B}
    • DFS(A):{A}
    • DFS(H):{H,I,G}
    • DFS(G):从列表中删除,因为它已被访问
    • DFS(I):从列表中删除,因为它已被访问
    • DFS(C):{C,J,F,D}
    • DFS(J):从列表中删除,因为它已被访问
    • DFS(F):从列表中删除,因为它已被访问
    • DFS(D):从列表中删除,因为它已被访问
    步骤4:将步骤3的深度优先林中每棵树的顶点作为单独的强连接组件输出。

    我们有五个强连通分量:{E},{B},{A},{H,I,G},{C,J,F,D}


    我认为这是正确的。然而,我发现的解决方案是,SCC是{C,J,F,H,I,G,D},和{A,E,B}。我的错误在哪里?你的步骤是正确的,你的答案也是正确的,通过检查您提供的其他答案,您可以看到他们使用了不同的算法:首先在G transposed上运行DFS,然后在G上运行无向组件算法,按照上一步中顶点的帖子编号降序处理顶点


    问题是他们在G上运行了最后一步,而不是在G上,因此得到了一个不正确的答案。如果您从第98页开始阅读Dasgupta,您将看到他们(尝试)使用的算法的详细解释。

    您的答案是正确的。根据CLRS,“有向图G=(V,E)的强连通分量是顶点C的最大集合,因此对于每对顶点u和V,我们都有u~>V和V~>u,即顶点V和u可以彼此到达。”


    如果你假设{C,J,F,H,I,G,D}是正确的,那么从D到G(在许多其他谬误中)是没有办法的,同样的,从A到E是没有办法的。

    看A
    B
    E
    :两者都有一个零的独立性,并且都形成一个(退化的)SCC。我认为相关的答案是错误的。(比我快40秒)我相信您提供的源代码中给出的答案是错误的,尽管两种实现都是正确的。我已经实现了他们使用的算法,我的算法给了我你得到的答案。我猜他们在某些地方犯了错误,但算法没有错。既不是你的也不是他们的。