題目鏈結:
題目大意:連通圖,找圖中割點,並計算切除該割點後,圖中的連通分量個數。
解題思路:
poj的資料很弱。
tarjan法求割點。
pre陣列,記錄這個點的dfs時間位置。
割點的條件是lowv>=pre[u], 即子點比父點先dfs,這時候父點就沒有意義了,切掉父點連通分量數肯定會增加。
同時注意特判只有兩個點的情況,這時候是不可能出現割點的。
求切除割點後的聯通分量數:
從割點出發,把圖dfs一遍,如果u=割點,那麼對於每個子點v,block++
原理就是,切掉割點後,所有與其連線子點都要受到影響,統計第一次訪問的子點v的block即可。
#include "cstdio
"#include
"vector
"#include
"string
"#include
"iostream
"#include
"cstring
"using
namespace
std;
#define maxn 1005
struct
edge
e[maxn*2
];int
pre[maxn],dfs_clock,block,head[maxn],tol;
bool
cut[maxn],vis[maxn];
void addedge(int u,int
v)int dfs(int u,int
fa)
else
if(pre[v]min(lowu,pre[v]);
}if(fa<0&&child==1) cut[u]=false
;
return
lowu;
}void check(int u,int
fa) }
}int
main()
if(!flag) cout<<"
no spf nodes
"
0,sizeof
(pre));
memset(cut,
false,sizeof
(cut));
memset(head,-1,sizeof
(head));
dfs_clock=0;num=0;tol=0
; printf("\n
");}
else
}}
13424402
neopenx
1523
accepted
216k
0msc++
2309b
2014-09-08 19:04:33
POJ 1523 SPF 雙連通分量 割點
題意 找出無向圖的割點,並判斷每個割點去掉後能形成多少個雙連通分量。分析 割點的定義 在深搜樹中,時間戳為 dfn k 當 k 滿足 1 2 中乙個時,k 為割點 1 k 為深搜樹的根,當且僅當 k 的兒子個數 2 時 k 為割點 2 k 為深搜樹的中間節點 k 既不是根也不是葉 那麼k 必然有父親...
POJ 1523 SPF (割頂 點雙連通分量)
題意就是求出在乙個圖上去除乙個點之後,那個圖會變成多少個子連通圖。顯然我們要求出割頂。我的 套用了劉汝佳的大白書的tarjan演算法,用乙個陣列cnt記錄乙個點是多少個點雙連通分量的割頂。當發現乙個點是割頂的時候,就cnt i 最後,如果乙個點是一棵dfs樹的樹根時,就輸出cnt i 否則就輸出cn...
POJ 2117 割點 連通分量
題目鏈結 題目大意 在乙個非連通圖中,求乙個切除圖中任意乙個割點方案,使得圖中連通分量數最大。解題思路 乙個大陷阱,m可以等於0,這時候要特判,結果就是n 1。同時出題者腦子秀逗了,也不給c的範圍。我開了兩倍點大小re了,於是怒開了五倍點大小才a了。本題不是連通圖,需要先計算原始圖中的連通分量。方法...