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

时间:2015-11-08 05:11:55

标签: algorithm graph-theory strongly-connected-graph

我正在尝试自学图论,现在试图了解如何在图中找到SCC。我已经在SO上阅读了几个不同的问题/答案(例如,123456,{ {3}},7),但我无法找到一个我可以遵循的完整分步示例。

根据8,一种方法是:

  
      
  1. 调用DFS(G)计算每个顶点u
  2. 的完成时间f [u]   
  3. 计算转置(G)
  4.   
  5. 调用DFS(Transpose(G)),但在DFS的主循环中,按f [u]递减的顺序考虑顶点(在步骤1中计算)
  6.   
  7. 将步骤3的深度优先林中每棵树的顶点输出为单独的强连接组件
  8.   

观察下面的图表(问题是来自CORMEN (Introduction to Algorithms)的3.4我找到了几个解决方案here.here,但我试图将其分解并自己理解。)

here

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

从顶点A开始运行DFS:

enter image description here

请注意格式为[Pre-Vist,Post-visit]

的RED文本

第2步:计算转置(G)

enter image description here

步骤3.调用DFS(Transpose(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}

这是我认为是正确的。但是,我发现enter image description herehere的解决方案表示SCC是{C,J,F,H,I,G,D}和{A,E,B}。我的错误在哪里?

2 个答案:

答案 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.