POJ 1523 SPF 雙連通分量 割點

2022-05-28 13:06:12 字數 1221 閱讀 7365

題意: 找出無向圖的割點,並判斷每個割點去掉後能形成多少個雙連通分量。

分析: 割點的定義:

在深搜樹中,時間戳為 dfn[k] ,當 k 滿足(1)(2)中乙個時,k 為割點

(1) k 為深搜樹的根,當且僅當 k 的兒子個數》=2 時 k 為割點;

(2) k 為深搜樹的中間節點(k 既不是根也不是葉),那麼k 必然有父親和兒子;

對於(1)是顯然的,根結點k一旦有2個以上的分支,那麼刪除k必然出現森林;

對於(2)首先注意low[son]>= dfn[k]這個條件,意思就是「k的兒子son的輩分最高的祖先(暫且設其為w)的深度,比k的深度要深(或者等於k的深度,此   時k就是w),就是說k的輩分比w更高(深度更淺),那麼一旦刪除k,son所在的網路勢必和 k的father所在的網路斷開」,那麼k就是割點。

code :

#include#include

#define min(a,b)(a)<(b)?(a):(b)

#define max(a,b)(a)>(b)?(a):(b)

#define clr(x)memset(x,0,sizeof(x))

const

int maxn=1010

;struct

node

e[10010

];int

tot;

inthead[maxn];

void add(int s,int

u)int

st,en;

intti;

intdfn[maxn];

intlow[maxn];

intnum[maxn];

void dfs(int p,int

u) }

}int

main()

clr(dfn); clr(low);

clr(num);

dfs(

0,st);

printf(

"network #%d\n

",ca++);

bool flag=true

;

for(i=st;i<=en;i++)

if(num[i])

if(flag)

printf(

"no spf nodes\n");

printf("\n

");}

return0;

}

POJ 1523 SPF (割頂 點雙連通分量)

題意就是求出在乙個圖上去除乙個點之後,那個圖會變成多少個子連通圖。顯然我們要求出割頂。我的 套用了劉汝佳的大白書的tarjan演算法,用乙個陣列cnt記錄乙個點是多少個點雙連通分量的割頂。當發現乙個點是割頂的時候,就cnt i 最後,如果乙個點是一棵dfs樹的樹根時,就輸出cnt i 否則就輸出cn...

雙連通分量

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

雙連通分量

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