割點問題 poj 1523 SPF

2021-09-01 04:15:01 字數 933 閱讀 4836

題目大意:給定乙個網路,看是否有關節點存在(即割點,即去除該點後,圖變成非連通圖),如果存在輸出該節點和去除該節點後連通子圖的個數,如果不存在割點即輸出沒有割點存在。

求割點直接用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,這時候父點就沒有意義了,切掉父點連通分量數肯定會增加。同時注意特判只有兩個...