图1、计算逆排序 图2、Kosaraju算法求强连通分量 图3、书中给出的算法证明 在G中的dfs(s),假设有s可达v且dfs(v)发生在dfs(s)调用过程中,即dfs(s)直接或间接调用了dfs(v)。此时在遍历顺序中,v应该排在s之后。反证法证明:如果v排在s之前,在dfs(s)遍历到v时,由于dfs(v)在之前已执行过,即marked[v]...
这正是Kosaraju算法最为精妙的地方,关键在于第二次DFS选取的顺序:在第一次DFS中,将顶点按照后序编号存放,第二次DFS就按照这个顺序的逆序进行搜索,这保证每次选取的根结点(刚才证明中的r结点)都具有未访问结点中最大的后序编号,则搜索中拓展的结点的后序编号都比根结点小,这样也就满足了事实二。 补充:Kosaraju算法...
求有向图的强连通分量还有一个强有力的算法,为Kosaraju算法。Kosaraju是基于对有向图及其逆图两次DFS的方法,其时间复杂度也是O(N+M)。与Trajan算法相比,Kosaraju算法可能会稍微更直观一些。但是Tarjan只用对原图进行一次DFS,不用建立逆图,更简洁。在实际的测试中,Tarjan算法的运行效率也比Kosaraju算法高30%左右。此外...