我正在尝试自学图论,现在试图了解如何在图中找到SCC。我已经在SO上阅读了几个不同的问题/答案(例如,1,2,3,4,5,6,{ {3}},7),但我无法找到一个我可以遵循的完整分步示例。
根据8,一种方法是:
- 调用DFS(G)计算每个顶点u
的完成时间f [u]- 计算转置(G)
- 调用DFS(Transpose(G)),但在DFS的主循环中,按f [u]递减的顺序考虑顶点(在步骤1中计算)
- 将步骤3的深度优先林中每棵树的顶点输出为单独的强连接组件
醇>
观察下面的图表(问题是来自CORMEN (Introduction to Algorithms)的3.4我找到了几个解决方案here.和here,但我试图将其分解并自己理解。)
步骤1:调用DFS(G)计算每个顶点的完成时间f [u] u
从顶点A开始运行DFS:
请注意格式为[Pre-Vist,Post-visit]
的RED文本第2步:计算转置(G)
步骤3.调用DFS(Transpose(G)),但在DFS的主循环中,按f [u]递减的顺序考虑顶点(在步骤1中计算)
好的,所以顶点按照访问后(完成时间)值减少的顺序:
{E,B,A,H,G,I,C,D,F,J}
所以在这一步,我们在G ^ T上运行DFS,但从上面列表中的每个顶点开始:
步骤4:将步骤3的深度优先林中每棵树的顶点输出为单独的强连通组件。
所以我们有五个强关联组件:{E},{B},{A},{H,I,G},{C,J,F,D}
答案 0 :(得分:0)
您的步骤是正确的,您的答案也是正确的,通过检查您提供的其他答案,您可以看到他们使用了不同的算法:首先在G转置上运行DFS,然后在G上运行无向组件算法处理顶点按照上一步的后期编号的降序排列。
问题是他们在G转换而不是在G中进行了最后一步,从而获得了一个不可思议的答案。如果您从第98页开始阅读Dasgupta,您将看到他们(尝试)使用的算法的详细说明。
答案 1 :(得分:0)
你的答案是对的。根据CLRS,“有向图G =(V,E)的强连通分量是顶点C的最大集合,这样对于每对顶点u和v,我们都有u~> v和v~ > u,即顶点v和u彼此可达。“
如果您认为{C,J,F,H,I,G,D}是正确的,则无法从D到G(在许多其他谬误中),并且与其他集相同,有无法从A到达E.