題意: 找出無向圖的割點,並判斷每個割點去掉後能形成多少個雙連通分量。
分析: 割點的定義:
在深搜樹中,時間戳為 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被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...