割點和橋學習筆記

2022-08-26 22:15:31 字數 3164 閱讀 2920

1.什麼是割點和橋:

如果在圖g中去掉乙個頂點(自然同時去掉與該頂點相關聯的所有邊)後,該圖的連通分支數增加,則稱該頂點為g的割點(割頂)(cut-vertex)。設無向圖g=,若存在e'⊆e使得p(g-e')>p(g),且對於任意的e''⊂e',均有p(g-e'')=p(g),則稱e'是g的邊割集,或簡稱為割集。若e'=,則稱e為割邊或橋。--度娘

對於乙個連通圖,如果任意兩點至少存在兩條點不重複路徑,則稱這個圖為點雙連通的(簡稱雙連通);如果任意兩點至少存在兩條邊不重複路徑,則稱該圖為邊雙連通的。點雙連通圖的定義等價於任意兩條邊都同在乙個簡單環中,而邊雙連通圖的定義等價於任意一條邊至少在乙個簡單環中。對乙個無向圖,點雙連通的極大子圖稱為點雙連通分量(簡稱雙連通分量),邊雙連通的極大子圖稱為邊雙連通分量

而在每乙個點雙連通圖中,內部無割點;

在每乙個邊雙連通圖中,內部無橋。

如圖:

1、2、3,2、4、5為兩個點雙連通分量,1、2、3、4、5卻在乙個邊雙連通分量中;

其中,2為割點。

而第二個圖中,2-6邊為橋。

2.怎麼判斷割點和橋:

tarjan演算法,老朋友了。

對於每個點,我們dfs求出dfs序,設這個點為u,其兒子為v;

若所有v不能到達dfs序小於u的點,則刪去u所有v不與和dfs序小於u的點連通,連通塊個數增加,所以u為割點;

當然,還有錯誤!!!

對於第乙個搜尋的點(dfs序為1)來說,若只有乙個子節點,便不是割點!

如:

若v除了u-v邊,不能到達dfs序小於等於u的點,u-v便是橋。

上圖中,3沒有其它邊到2,所以2-3為橋;而4的父親是3,還可以通過4-5,5-3到3,不是橋。

下面論證tarjan演算法的正確性:

1.為什麼可以搜到所有橋:

橋最多有n-1條,

因為對於乙個點來說,最多向父節點連一條橋,而如果超過一條,父子間就不存在橋;

而向兒子們連的橋,可將其視作屬於兒子們。 

2.為什麼可以搜到所有割點:

將這個點的祖宗看作乙個連通塊,將它的每個兒子看作乙個連通塊,它是連線多個連通塊的關鍵點,

如果刪去它之後,所有兒子連通塊跟祖宗連通塊相連,此點不是割點;

只要有乙個子連通塊不跟父連通塊相連通,刪去它後連通塊個數增加,是割點。

你可能會想問:可不可能存在刪去它後,幾個子連通塊與父連通塊連通,其它子連通塊與這幾個子連通塊連通呢?

不存在的!

根據dfs的性質,除了父親,其它與它連通的都是兒子。

如果「其它子連通塊與這幾個子連通塊連通」,「其它子連通塊」原來就屬於「這幾個子連通塊」。

最後貼貼**:

割點:

1 #include2

#define re register

3using

namespace

std;

4const

int n=20006,m=200006;5

int n,m,low[n],head[n],dfn[n],deep=0,cnt=0,is_cut[n],t1,t2,tot=0;6

struct

edge

7e[m];

10 inline void add(int u,int v)

11 inline int

read()

1215

while(ch>='

0'&&ch<='

9') t=(t<<3)+(t<<1)+(ch-48),ch=getchar();

16return f*t;17}

18void tarjan(int u,int

fa)19

29else low[u]=min(low[u],dfn[v]);30}

31if(!fa&&num>=2) is_cut[u]=1

; 32}33

intmain()

34

橋:

1 #include2

#define re register

3using

namespace

std;

4const

int n=20006,m=200006;5

int n,m,low[n],head[n],dfn[n],deep=0,cnt=0

,t1,t2,f[n];

6struct

edge

7e[m];

10 inline void add(int u,int v)

11 inline int

read()

1215

while(ch>='

0'&&ch<='

9') t=(t<<3)+(t<<1)+(ch-48),ch=getchar();

16return f*t;17}

18void tarjan(int u,int

fa)19 27

}28intmain()

29

學習筆記 Tarjan演算法求橋和割點

在之前的部落格中我們已經介紹了如何用tarjan演算法求有向圖中的強連通分量,而今天我們要談的tarjan求橋 割點,也是和上篇有部落格有類似之處的。橋 在乙個有向圖中,如果刪去一條邊,而後這個有向圖不再聯通,我們便稱刪去的這條邊為有向圖的橋。割點 在乙個有向圖中,如果刪去乙個點,使這個有向圖中剩下...

割點和橋模板

include include include include using namespace std define mymax 200 typedef vectoredge vectorg mymax bool visited mymax int dfn mymax int low mymax i...

tarjan求割點和橋(割邊)

tarjan求割點和橋 例題 割點 重要的地方在 中都有注釋 include define ll long long using namespace std const ll m 2e4 10,maxn 3e6 30 int dfn m low m tot int e m 1 k,p m k2 ve...