有向图上的DFS& Kosaraju的算法

时间:2014-02-04 23:26:58

标签: algorithm graph depth-first-search directed-graph

我无法理解Kosaraju的算法,用于查找有向图的强连通分量。这是我在笔记本上的内容(我是学生:D):

  1. 从任意顶点开始(用#1标记)并执行DFS。如果不能再进一步,请用#2标记最后访问的顶点,然后启动另一个DFS(跳过已标记的顶点),依此类推。
  2. 转置图表。
  3. DFS以相反的顺序从每个顶点开始,每个DFS之后访问的那些顶点属于同一个SCC。
  4. 我有这个例子:

    从E开始的第一步之后,标签是:

    1. 电子
    2. ķ
    3. Ĵ
    4. I
    5. ħ
    6. ˚F
    7. C
    8. d
    9. A
    10. 所以事情就是这样:DFS在有向/无向图中有区别吗? 我做了第一步的心理测试,忽略了箭头(就像它是无向的),只有E(当然)和#2的正确#1,但#3落在J上,而不是K.所以我想也许我应该尊重箭头,并考虑到DFS做了,但是在从E开始的第一次传球后,我无法从G(这是#2)去任何地方,所以我被卡住了那里。

      在我不知道的有向图上有什么关于DFS的吗?我只在无向图上教过DFS!

1 个答案:

答案 0 :(得分:1)

你的第二步是不完整的。见Wikipedia

  

Kosaraju的算法如下:

     
      
  • 设G是有向图,S是空堆栈。
  •   
  • 虽然S不包含所有顶点:   
        
    • 选择不在S中的任意顶点v。执行从v开始的深度优先搜索。每次深度优先搜索完成展开顶点u时,将u推到S
    •   
  •   
  • 反转所有弧的方向以获得转置图。
  •   
  • 虽然S是非空的:   
        
    • 从S弹出顶部顶点v。在转置图中从v开始执行深度优先搜索。该组访问顶点将给出包含v的强连通分量;记录这个并从图G和堆栈S中删除所有这些顶点。等效地,可以使用广度优先搜索(BFS)代替深度优先搜索。
    •   
  •   

所以你不应该只对最后一个顶点和第一个顶点做一些事情,而是在DFS中使用每个顶点。

另请注意,您应该backtracking - 当您无法继续前进时,您将转到上一个顶点并从那里继续。

不,你不能将它视为无向图 - 边缘的方向很重要。

因此,从E开始,您可以转到F,然后转到G,然后返回F,再转到H,然后K,然后I,然后J,然后回到IKHF,最后E,已将所有访问过的顶点推到堆栈上。