對於強連通分量,是只懂得原理,但不知道如何用演算法實現求解。今天就對強連通分量的演算法進行乙個整理,也對強連通分量的例項進行分析。
強連通分量出現在有向有環圖中,每乙個連通的分量都可以被當作是強連通分量。如左下圖每乙個虛線框內都是乙個強連通分量,右下圖則將強連通分量當作乙個結點後構成的乙個dag
在《演算法概論》中採用的pre,post時間序列的線性演算法中,強連通分量有以下的特點:
1. 在dfs中得到的post值最大的頂點一定位於乙個源點強連通部件中
2. 如果c和c』是強連通部件,同時從c中的乙個頂點到c』中的乙個頂點存在一條邊,則c中post的最大值要大於c』中post的最大值。
3. 每個有向圖至少存在乙個匯點和乙個源點
根據上面的性質,強連通部件能夠通過按照其各自內部頂點的post最大值的降序排列,實現線性化。
一旦我們找到了第乙個匯點強連通部件,就將它從圖中刪除(刪除該強連通部件的所有結點),得到的新圖中的post值最大的頂點一定在新圖中的乙個匯點強連通部件中。從而我們可以重複使用這種基於針對gr
的dfs的頂點post值排序操作。完成上述動作直至找到所有的強連通部件為止。
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量
對於有向圖的乙個頂點集,如果從這個頂點集的任何一點出發都可以到達該頂點集的其餘各個頂點,那麼該頂點集稱為該有向圖的乙個強連通分量。有向連通圖的全部頂點組成乙個強連通分量。我們可以利用tarjan演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...