第1節 連通性強連通 割點和橋(一)

2021-10-25 12:26:16 字數 3059 閱讀 8662

有向圖的弱連通與強連通

• 給定無向聯通圖g=(v,e) • 對於乙個點x,若從圖中刪除x及所有與x相連的邊,圖不再聯通,x是g的割點

• 對於一條邊e,從圖中刪去e,圖不再聯通,e的x的割邊

• 乙個圖如果不存在割點,則它是乙個點雙連通圖,乙個圖的極大點雙連通子圖是他的點雙連

通分量。

• 乙個圖如果不存在割邊,則它是乙個邊雙連通圖,乙個圖的極大邊雙連通子圖是他的邊雙連

通分量。

時間戳dfn :第n個搜到這個點

返祖邊:搜尋樹上乙個點連向其祖先節點的邊

橫插邊:搜尋樹上乙個點連向它另一條支鏈上的點的邊----在無向圖中不存在

追溯值low:當前點及其子樹的返祖邊能連到的dfn值最小的點

如果是搜尋樹的邊:low[u]=min(low[u],low[v])

• u點是割點,v是u搜尋樹上的乙個兒子:dfn[u] <= low[v] ——v的子樹中沒有返祖邊能跨越u點;有多個兒子的根節點

比如圖中的點10和點7

• 邊是橋,搜尋樹上v是u的兒子:dfn[u]這條邊

void tarjan

(int x)

//求割點

}else low[x]

=min

(low[x]

,dfn[v]);

}}

求割邊:if(low[v] > dfn[x])

• 把橋刪了每個連通塊都是乙個邊雙聯通分量——標記出橋之後dfs一遍即可

• 點雙連通分量要複雜一些——乙個割點可能屬於多個雙聯通分量

點雙連通分量性質:

任意兩點間至少存在兩條點不重複的路徑等價於圖中刪去任意乙個點都不會改變圖的連通性,即bcc中無割點

若bcc間有公共點,則公共點為原圖的割點

無向連通圖中割點一定屬於至少兩個bcc,非割點只屬於乙個bc

點雙連通分量求法::

• 維護乙個棧

• 第一次訪問某個節點時,將其入棧

• 當割點判斷法則中dfn[x]<=low[y]成立時,不斷從棧中彈出節點,直到y被彈出,這些被彈出的點和x一起構成乙個點雙連通分量

#include

#include

#include

using namespace std;

struct edge

edges[

1000001];

int head[

1000001

],dfn[

1000001

],dfs_clock,tot;

int num;

//bcc數量

int stack[

1000001

],top;

//棧

vector<

int>bcc[

1000001];

inttarjan

(int u,

int fa)

}else

if(edges[i]

.to!=fa)

lowu=

min(lowu,dfn[edges[i]

.to]);

return lowu;

}void add

(int x,

int y)

//鄰接表存邊

intmain()

for(

int i=

1;i<=n;i++

)//遍歷n個點tarjan if(

!dfn[i]

)for

(int i=

1;i<=num;i++

)return0;

}

• 每個邊雙連通分量縮成乙個點,再用原來的橋把他們連起來

• 點雙聯通分量因為乙個割點可能包含在多個點雙連通分量裡面,所以我們將每個割點保留割點與其所在的點雙連通分量連邊即可。

• 在有向圖g=(v,e)中,如果對於任意兩點u,v,存在一條從u到v或者從v到u的路徑——弱聯通

• 在有向圖g=(v,e)中,如果對於任意兩點u,v都互相可達——強聯通

• 有向圖強連通分量:在有向圖g中,如果兩個頂點vi,vj間(vi>vj)有一條從vi到vj的有向路

徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通(strongly connected)。 • 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。

• 有向圖的極大強連通子圖,稱為強連通分量(strongly connected components)。

• 對原圖進行一次dfs(任意起點)

• 在第一次形成的森林的每一顆樹里,以第一次搜尋出棧時間的逆序對反圖進行dfs,這次搜尋a能到達的點和a都在乙個強連通分量裡面

• dfn[n]時間戳

• low[n]他和他的子樹裡返祖邊和橫叉邊能連到還沒出棧的dfn最小的點

• 在dfs的時候維護乙個棧第一次訪問到某個點就將其加入到棧中,當乙個點x的dfn[x] == low[x] 時,他就是這個強連通分量裡面在搜尋樹中最高的點,將棧裡點出棧直到x也出棧為止,這些點組成乙個強連通分量。

void tarjan

(int x)

else

if(vis[v]

)low[x]

=min

(low[x]

,dfn[v]);

if(dfn[x]

==low[x]

)//是否是強連通分量最高的點

while

(x!=cur);}

}}

強連通割點割橋模板

如果u是根節點,只要它有兩個子節點就說明是割點,否則,滿足 u,v 為樹枝邊 或稱父子邊,即u是v的父親 使得dfn u low v 橋無向邊 u,v 當且僅當 u,v 為樹枝邊,且滿足dfn u include include include include include include inc...

Tarjan求強連通 縮點 割點 割邊

1.如果乙個無向圖中每個頂點從所有其他頂點都是可達的,則稱該圖是連通的。圖的連通分量 從.可達 的等價類.2.如果乙個有向圖中任意兩點互相可達,則該有向圖是強連通的 相互可達 等價類 3.有向圖g v,e 的強連通分量是乙個最大節點集合c包含於v,對於該集合中任意節點u,v,節點u,v可以相互到達 ...

點連通分量 邊連通分量 割點和橋 強連通分量

老是搞不清他們的關係,不知道該用那份 今天理了一下,整理一下模板 點連通分量 可以求出點連通分量包含哪些點,那個點屬於那個連通分量 struct edge int pre maxn iscut maxn bccno maxn dfs clock,bcc cnt vectorg maxn bcc ma...