首先介紹的是乙個強大的連線。頂點之間的緊密聯絡是假設v達到w,然後,w你可以達到v。頂點之間的強連線就表示頂點之間能夠雙向到達,也就是說兩個頂點在乙個回路上。
介紹了強連線。那什麼是強連線部件呢?強連線部件就是可以相互到達的全部頂點的集合。乙個圖中可能會有多個強連線。
強連線在離散數學中屬於等價關係,也就是說它具有反射性,相反性。傳遞性。
強連線在生物學中有所應用。食物鏈就是乙個樣例。下圖展示了乙個非常小的食物鏈。
在食物鏈中,強連線部件表示在同乙個部件中的生物共享同樣的能量流。
強連線部件在軟體project中也有應用。乙個軟體中有很多模組。假設將軟體中的模組看成頂點,將模組之間的依賴關係看成圖論中的邊。那麼這就是乙個有向圖。在同乙個強連線部件中的模組之間耦合度是比較高的。依照軟體設計原則,耦合度高的模組往往要放在乙個包中。
所以,強連線部件能夠檢測模組之間的耦合度。能夠軟體結構的優化起到指導作用。
為了計算出乙個有向圖中有多少強連線部件,世界上有一種名叫kosaraj sharir演算法,這樣的演算法很easy。可是比較神奇,一般的人無法直觀地看出為什麼這樣算可以得到正確的結果。
這個演算法的分為兩個階段。
第乙個階段就是對有向圖的反圖進行拓撲排序。注意是反圖。第二個階段就像連線部件演算法一樣,依照排序結果,對未曾訪問過的節點執行dfs。
有了這種思路。那麼**就立即出來了:
public class strongcomponent }}
public int count()
public boolean stronglyconnected(int v, int w)
public int id(int v)
private void dfs(digraph g, int v) }}
}
強連通分量 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 下圖中,子圖為乙個強連通分量,因為...