針對無向連通圖,若刪除乙個點後使得該圖不連通,則該點是割點。
注意:乙個圖中可能有多個割點
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 為這個圖的割邊。當然那張圖可能本來就不連通,所以嚴格來說是把...