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