Algorithm 如何在图中找到强连通的组件?
我正在自学图论,现在试图理解如何在图中找到答案。我已经阅读了关于SO的几个不同的问题/答案(例如,,,,,,),但我找不到一个完整的循序渐进的例子 根据本发明,一种方法是: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,我已经找到了几个解决方案,但我正在尝试将其分解并自己理解。) 步骤
- 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):从列表中删除,因为它已被访问
我认为这是正确的。然而,我发现的解决方案是,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秒)我相信您提供的源代码中给出的答案是错误的,尽管两种实现都是正确的。我已经实现了他们使用的算法,我的算法给了我你得到的答案。我猜他们在某些地方犯了错误,但算法没有错。既不是你的也不是他们的。