雙連通分量就是無向圖中的強連通分量,基本就是找割頂和橋。割頂就是乙個點,如果把它取掉,連通分量數量就會增加,橋就是一條邊,同理。
對於乙個連通圖,如果任意兩點至少存在兩條「點不重複」的路徑,也就是任意兩條邊都在乙個簡單環中,即內部無割頂,則說這個圖是點雙連通的。
對於乙個連通圖,如果任意兩點至少存在兩條「邊不重複」的路徑,也就是任意邊都至少在乙個簡單環中,即所有邊都不是橋,則說這個圖是邊雙連通的。
具體的看白書吧:
#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 無法保持所有點連通,那這...