雙連通分量

2021-07-24 09:35:18 字數 1130 閱讀 3913

雙連通分量就是無向圖中的強連通分量,基本就是找割頂和橋。割頂就是乙個點,如果把它取掉,連通分量數量就會增加,橋就是一條邊,同理。

對於乙個連通圖,如果任意兩點至少存在兩條「點不重複」的路徑,也就是任意兩條邊都在乙個簡單環中,即內部無割頂,則說這個圖是點雙連通的。

對於乙個連通圖,如果任意兩點至少存在兩條「邊不重複」的路徑,也就是任意邊都至少在乙個簡單環中,即所有邊都不是橋,則說這個圖是邊雙連通的。

具體的看白書吧:

#include#include#include#include#includeusing namespace std;

const int maxn = 10000;

int pre[maxn], iscut[maxn], bccno[maxn], dfs_clock, bcc_cnt;//bccno是判斷當前點是否已經入塊

typedef pairpair;

vectorg[maxn], bcc[maxn];//bcc是存放每個塊中有的點

stacks;//棧存放當前塊中的邊

int dfs(int u, int fa)

if (bccno[x.second] != bcc_cnt)

if (x.first == u&&x.second == v)

break;}}

} else if (pre[v] < pre[u] && v != fa)//已經訪問過就更新low

} if (fa < 0 && child == 1)//只有乙個子節點的根節點不是割頂

iscut[u] = 0;

return lowu;

}void find_bcc(int n)

int main()

find_bcc(n);

printf("there are %d cnt in the graph,they are: ", bcc_cnt);

for (int i = 1; i <= n; i++)

if (iscut[i])

printf("%d ", i);

printf("\n");

for (int i = 1; i <= bcc_cnt; i++)

return 0;

}

雙連通分量

在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...

雙連通分量

在乙個無向連通圖中,如果任意去掉乙個定點i及依附於i的所有邊後得到的圖仍然連通,則稱該圖為 2 連通圖 否則,若得到多個連通分量,則該圖不是雙連通的,頂點i被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...

雙連通分量

無向圖的雙連通分量跟有向圖的連通分量有點像。先說說一些定義。時間戳 以某個點vi 為起點,dfs到的其他點vj 的時間。通常用pre表示 連通圖 每兩個點間都有路徑存在的無向圖就叫連通圖。割頂 cut vertex 也叫割點。在某個連通圖 g 中,若去掉某個點 i,該圖 g 無法保持所有點連通,那這...