知識點 割點與割邊

2021-09-26 06:37:11 字數 1589 閱讀 3232

針對無向連通圖,若刪除乙個點後使得該圖不連通,則該點是割點。

注意:乙個圖中可能有多個割點

o (n

+m

)o(n+m)

o(n+m)

我們在遍歷所有點時會遇到割點(廢話),主要是如何認定乙個點是割點。假設訪問到了k點,如果在沒有訪問過的點中,至少有乙個點在不經過k點的情況下,無法回到已訪問過的點,則k點是割點。(因為該圖刪除點k後不連通了)

演算法核心:如何判斷未被訪問過的點u在不經過點k的情況下能否返回任何乙個已訪問過的點。

從樹的角度來看,k是u的父親,u是k的兒子,判斷u能否不經過k而回到它的所有祖先。

我們用陣列low來表示每個點在不經過父節點的前提下,能返回的最早的時間戳。

#include

using

namespace std;

int n,m,e[

1005][

1005

],root,num[

1005

],low[

1005

],flag[

1005

],index;

void

dfs(

int cur,

int dad)

else

if(cur==root && child==2)

}else

if(low[i]

!=dad)}}

}int

main()

root=1;

dfs(

1,root)

;return0;

}

割邊也成為橋,與割點類似

針對無向連通圖,若刪除一條邊後使得該圖不連通,則該邊是割邊。

同樣的,乙個圖中可能有多條割邊

割邊的求法也與割點類似,只需將

if(low[i]>=num[cur])

改為:if(low[i]>num[cur])

就行了,即該點到除了達不了它的任何祖先,也無法到達它的父親。

好了,呈上**,請注意輸出部分:

#include

using

namespace std;

int n,m,e[

1005][

1005

],num[

1005

],low[

1005];

int root,index;

void

dfs(

int cur,

int dad)

else

if(i!=dad)

//i是cur的祖先,更新low

low[cur]

=min

(low[cur]

,num[i]);

}}}int

main()

root=1;

dfs(

1,root)

;return0;

}

割點 割邊 tarjan

洛谷割點模板題 傳送門 割邊 在連通圖中,刪除了連通圖的某條邊後,圖不再連通。這樣的邊被稱為割邊,也叫做橋。割點 在連通圖中,刪除了連通圖的某個點以及與這個點相連的邊後,圖不再連通。這樣的點被稱為割點。dfs搜尋樹 用dfs對圖進行遍歷時,按照遍歷次序的不同,我們可以得到一棵dfs搜尋樹。樹邊 在搜...

割點和割邊

在無向圖中,所有能互通的點組成了乙個 連通分量 在乙個連通分量中有一些關鍵的點,如果刪除它們,會把這個連通分量分成兩個或更多,這種點稱為割點 cut vertex 類似的有割邊 cut edge,又稱為橋,bridge 問題。在乙個連通分量中,如果刪除一條邊,把這個連通兩個 注意邊最多只能分成兩個 ...

演算法筆記 割點與割邊

一般用 tarjan 演算法解決 橋和割邊是乙個東西 若對於無向連通圖的乙個點 x 從圖中刪去這個點和與這個點相連的所有邊後,圖不再是連通圖,則 x 為這個圖的割點。若對於無向連通圖的一條邊 e 從圖中刪去這條邊後,圖不再是連通圖,則 e 為這個圖的割邊。當然那張圖可能本來就不連通,所以嚴格來說是把...