POJ 3352 雙連通縮點求縮點樹葉子節點數

2022-04-07 12:07:26 字數 1302 閱讀 1844

題意:

給定n個點m條邊的無向圖(保證連通)

問:至少加多少條邊可以使圖為雙連通圖)

思路:雙連通圖即所有點都屬於至少乙個環中

顯然我們先把圖縮點得到一棵縮點樹,問題就轉成在縮點樹上加最少多少條邊使得圖為雙連通圖。

對於n個節點的無根樹,至少要 (1+left)/2 條邊(left為葉子節點數)

#include

#include

#include

#include

#include

#include

using namespace std;

#define n 1005

#define m 1005

struct edgeedge[m*2];

int head[n], edgenum;

void addedge(int u, int v);

edge[ edgenum ] = e;

head[u] = edgenum++;

}int n, m;

int dfn[n], low[n], tarjan_time, tar, stack[n*5], top;

int belong[n];

bool iscut[n];

void tarjan(int u, int fa)

if(!dfn[v])

}else low[u] = min(low[u], dfn[v]);

} if(child == 1 && fa<0)iscut[u] = false;

if(low[u] == dfn[u])

while(stack[top--] != u); }}

int du[n];

bool connect[n][n];

char tmp[1000];

void init()

int main()

tarjan(1, -1);

for(int i = 0; i < edgenum; i++)if(edge[i].cut)

int ans = 0;

for(int i = 1; i <= tar; i++) ans += (du[i] == 1);

printf("%d\n", (1+ans)>>1);

} return 0;}/*

10 12

1 21 3

1 42 5

2 65 6

3 73 8

7 84 9

4 10

9 10

3 31 2

2 31 3

*/

求橋,邊雙連通縮點

乙個無向圖,問最少新增多少條邊使任意兩點有兩條不同路徑。即構造乙個邊雙連通圖,邊雙連通縮點後是一棵樹,度數為1的點為a,結論是需要新增 a 1 2條邊。include include include include include include include include include in...

poj 3352 邊雙連通分量

思路 可以求出所有的橋,把橋刪掉。然後把所有的連通分支求出來,顯然這些連通分支就是原圖中的雙連通分支。把它們縮成點,然後添上剛才刪去的橋,就構成了一棵樹。在樹上添邊使得樹變成乙個雙連通分支即可,這裡我們可以直接統計縮點後的葉子節點個數即可,從而要加的邊數即為 葉子節點個數 1 2.1 include...

POJ 3352 邊雙連通分量

題目鏈結 題目大意 乙個連通圖中,至少新增多少條邊,使得刪除任意一條邊之後,圖還是連通的。解題思路 首先來看下邊雙連通分量的定義 如果任意兩點至少存在兩條 邊不重複 的路徑,那麼說這個圖是邊雙連通的。那麼本題中,刪除任意一條邊,就可以看作是毀掉一條路徑,那麼只要至少還存在一條路徑即可。也就是說,轉化...