強連通分量

2022-09-07 06:39:10 字數 1733 閱讀 7210

有向圖中,若對於圖中任意節點 \(x,y\) ,既存在 \(x\) 到 \(y\) 的路徑,也存在 \(y\) 到 \(x\) 的路徑,則該圖是強連通圖。

強連通分量是有向圖的極大強連通子圖。

求出乙個有向圖的強連通分量:

用 dfs 遍歷圖,訪問到乙個節點就把該節點入棧,並記錄時間戳。

定義乙個點的追溯值為滿足以下條件節點的最小時間戳:

點在當前棧內。

存在一條以當前點子樹中的點出發的邊以該點為終點。

dfn[x]=low[x]=++gpc;

for(int i=head[x];i;i=nxt[i])

else if(ins[ver[i]])low[x]=min(low[x],dfn[ver[i]]);

} //此處為處理最後一條鏈

(\(ins_x\) 記錄 \(x\) 是否在棧內,\(dfn_x\) 表示 \(x\) 的時間戳,\(low_x\) 表示 \(x\) 的追溯值)

結論:遞迴回溯時,若 \(dfn_x=low_x\),則從棧頂到 \(x\) 的節點構成乙個強連通分量。(求出強連通分量後把強連通分量中的點彈出)

證明:考慮數學歸納法,乙個點顯然是強連通圖,若有乙個大小為 \(i\) 的強連通圖 \(g\),若 \(x\in g\),且邊 \((x,y)(y\not\in g)\),(條件1)

只要存在邊 \((y,z)(z\in g)\),則 $g\and y $ 也是乙個強連通圖。(條件2)

由於是棧頂到 \(x\) 間的節點,所以滿足條件1;

由於棧頂到 \(x\) 間的點追溯值和時間戳均不相等(不包括 \(x\))且 \(dfn_x=low_x\),所以滿足條件2。

所以棧頂到 \(x\) 的節點構成乙個強連通圖。

同樣因為 \(dfn_x=low_x\),所以這些點和其他的點間沒有連邊,即不會形成環,所以這個子圖是極大的強連通圖,即強連通分量。

void tarjan(int x)

else if(ins[ver[i]])low[x]=min(low[x],dfn[ver[i]]);

} if(low[x]==dfn[x])while(x!=y);

}}

求出強連通分量後,可以將乙個強連通分量視作乙個節點,易得這樣的圖一定是乙個有向無環圖。

p3387 【模板】縮點

模板,求出強連通分量並縮點後,圖變為乙個 dag,乙個強連通分量的貢獻為分量中點權之和。

按拓撲序 dp 即可。

p2272 [zjoi2007]最大半連通子圖

模板,求出強連通分量並縮點後,圖變為乙個 dag,易得此時的最大半連通子圖是圖中的最長鏈。

按拓撲序 dp 即可。

p2746 [usaco5.3]校園網network of schools

模板,求出強連通分量並縮點。

對於入度不為一的點,若其他點都被覆蓋,那它也一定會被覆蓋,所以第一問答案為入度為0的點的個數。

對於第二問,所有點的入度和出度都不能為0,所以答案為 \(\max(p,q)\) 。( \(p\) 個入度為0的點, \(q\) 個出度為0的點)

p1407 [國家集訓隊]穩定婚姻

情人之間男向女連邊,夫妻之間女向男連邊;

考慮斷開乙個強連通分量中的一對夫妻,他們在強連通分量內可以重新分配,這樣乙個強連通分量內的夫妻一定不安全。

tricks:

可以判斷一些特殊的環,比如在邊權只有0和1時判斷是否存在正環。

二分圖最大匹配的必經邊。

強連通分量 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 下圖中,子圖為乙個強連通分量,因為...