題目大意:給定乙個網路,看是否有關節點存在(即割點,即去除該點後,圖變成非連通圖),如果存在輸出該節點和去除該節點後連通子圖的個數,如果不存在割點即輸出沒有割點存在。
求割點直接用dfs解決即可,問題在於統計去除該割點後,連通子圖的個數,其實在dfs時,遇到割點時,只要發現其兒子結點的low值比該割點的dfn值大或相等,那麼去除該結點後,其兒子結點能到達的所有結點 必定構成乙個連通子圖,這樣用乙個son陣列記錄所有這樣的兒子結點的個數,最後加上割點的父親結點能到達的所有結點形成的連通子圖,即為去除該結點後整個圖的連通子圖的個數。
**如下:
#include#include#include#includeusing namespace std;
const int maxn = 1100;
int root = 1;
#define min(a,b) a>b?b:a
#define max(a,b) a>b?a:b
int vis[maxn],cut[maxn],low[maxn],dfn[maxn],son[maxn],p[maxn],used[maxn];
vectorg[maxn];
void init()
} else if(v!=father)
}son[u] = record;
}int main()
if(u==0&&start)break;
for(int i=0;i}
bool flag = false;int cnt = conn();
printf("network #%d\n",++cas);
for(int i=0;i}
if(!flag)
printf("\n");
init();start = 1;
} return 0;
}
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 1523 割點 連通分量
題目鏈結 題目大意 連通圖,找圖中割點,並計算切除該割點後,圖中的連通分量個數。解題思路 poj的資料很弱。tarjan法求割點。pre陣列,記錄這個點的dfs時間位置。割點的條件是lowv pre u 即子點比父點先dfs,這時候父點就沒有意義了,切掉父點連通分量數肯定會增加。同時注意特判只有兩個...