題意就是求出在乙個圖上去除乙個點之後,那個圖會變成多少個子連通圖。
顯然我們要求出割頂。我的**套用了劉汝佳的大白書的tarjan演算法,用乙個陣列cnt記錄乙個點是多少個點雙連通分量的割頂。當發現乙個點是割頂的時候,就cnt[i]++。最後,如果乙個點是一棵dfs樹的樹根時,就輸出cnt[i],否則就輸出cnt[i]+1(因為那個點有父親,而cnt陣列記錄的相當於是該點的兒子個數)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
struct edge
edge(){}
};const int maxn=1005;
int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;
vectorg[maxn],bcc[maxn];
vector > ans;
int cnt[maxn];
bool isfa[maxn];
stacks;
int dfs(int u,int fa)
if(bccno[x.v]!=bcc_cnt)
if(x.u==u&&x.v==v) break;}}
} else if(pre[v]maxed) maxed=u;
scanf("%d",&v);
if(v>maxed) maxed=v;
valid=true;
u--,v--;
g[u].push_back(v);
g[v].push_back(u);
}else
} if(!flag) break;
if(valid==false) break;
find_bcc(maxed);
bool hascut=false;
for(int i=0;i
POJ 1523 SPF 雙連通分量 割點
題意 找出無向圖的割點,並判斷每個割點去掉後能形成多少個雙連通分量。分析 割點的定義 在深搜樹中,時間戳為 dfn k 當 k 滿足 1 2 中乙個時,k 為割點 1 k 為深搜樹的根,當且僅當 k 的兒子個數 2 時 k 為割點 2 k 為深搜樹的中間節點 k 既不是根也不是葉 那麼k 必然有父親...
割點問題 poj 1523 SPF
題目大意 給定乙個網路,看是否有關節點存在 即割點,即去除該點後,圖變成非連通圖 如果存在輸出該節點和去除該節點後連通子圖的個數,如果不存在割點即輸出沒有割點存在。求割點直接用dfs解決即可,問題在於統計去除該割點後,連通子圖的個數,其實在dfs時,遇到割點時,只要發現其兒子結點的low值比該割點的...
poj1523割頂 點雙聯通
題意 求出所有的割頂,而且還有輸出該割頂連線了幾個點雙連通分量 題解 直接tarjan求點雙聯通分量就好了,可以在加入邊的時候記錄加入次數,大於1的都是橋,輸入輸出很噁心,注意格式 include include include include include include include inc...