对用2遍dfs求有向图强连通分量的理解
第一遍dfs是對原圖進行,求出每個結點的后序遍歷順序,也叫時間戳,注意保存方式,應該是保存每個時間點的訪問的結點,而不是保存每個結點的訪問時間;
第二遍dfs是對逆圖進行,根據第一遍dfs的結果,首先在逆圖上從時間戳最大的結點開始dfs,可以得到第一個強連通分量,將遍歷過的結點標記,然后從下一個時間戳最大的且尚未標記的結點開始dfs,可以得到第二個強連通分量,以此類推,直到所有結點都確定其所在的強連通分量,此時算法結束。
首先分析由此算法得到的第一個強連通分量的正確性,易知時間戳最大的是有向圖的根結點:
1、從根結點出發,可以到達所有結點;
2、第二遍dfs是在逆圖上進行的,所以第二遍dfs得到的是所有能到達根結點的結點。
由以上2點和強連通分量的定義可知,第二遍dfs得到的確實是根結點所在的強連通分量。
然后考慮將第一個強連通分量所包含的結點從原圖中去掉(標記),則得到一個有向圖的森林(可能含有多個根結點),時間戳最大的結點是森林中的某個根結點,問題轉化為以上討論過的形式,在此不再重復。
以上所說的“從根結點出發,可以到達所有結點”其實是有問題的……
另一種稍微嚴謹的分析:
首先證明一個結論:若從時間戳較小的結點a出發可以到達時間戳較大的結點b,那么從結點b出發一定可以到達結點a
反證法:假設a的后序遍歷時間戳<b的時間戳,從a可達b,但從b不可達a,則該圖至少有2個強連通分量,第一遍dfs存在2中情況:
情況1:a所在的強連通分量在第一遍dfs時先于b所在的強連通分量,由于a可達b,所以b的后序遍歷時間戳將小于a的時間戳,與條件矛盾;
情況2:b所在的強連通分量在第一遍dfs時先于a所在的強連通分量,由于b不可達a,所以b的后序遍歷時間戳將小于a的時間戳,與條件矛盾。
終上所述,結論得證。
有了以上結論,第二遍dfs就好理解了,第二遍dfs是從當前時間戳最大的結點開始的,且是對逆圖進行dfs,所以找到的都是時間戳小于當前結點的且在原圖上能到達當前結點的所有結點,根據以上結論,所以當前結點能到達所有這些找到的結點,所以就找到了當前結點所在的強連通分量所含的結點。
轉載于:https://www.cnblogs.com/algorithms/archive/2012/07/05/2577596.html
總結
以上是生活随笔為你收集整理的对用2遍dfs求有向图强连通分量的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows server 2012
- 下一篇: 经纬密度