邊雙連通分量 jarjan poj 3177

2022-06-02 08:06:08 字數 1191 閱讀 4217

大意:給定乙個無向連通圖,判斷至少加多少的邊,才能使任意兩點之間至少有兩條的獨立的路(沒有公共的邊,但可以經過同乙個中間的頂點)。

思路:在同乙個雙連通分量裡的所有的點可以看做乙個點,收縮後,新圖是一棵樹,樹的邊便是原圖的橋。現在問題轉化為「在樹中至少新增多少條邊能使圖變成邊雙連通圖」,即新增的邊的個數=(樹中度為一的節點數目+1)/2,用trajan演算法求雙聯通分量

這是乙個模板

1 #include2 #include3 #include

4 #include5 #include6 #include7

using

namespace

std;

8const

int maxn=1e4+10;9

struct

node

10g[2*maxn];

13int

cnt;

14int

head[maxn];

15int

stack[maxn];

16int

instack[maxn];

17int

low[maxn],dfn[maxn];

18int

belong[maxn],du[maxn];

19int

block,index;

20int

bridge,top;

21void

init()

2226

void build(int u,int

v)27

30void tarjan(int u,int

pre)

3147}48

else

if(low[u]>dfn[v]&&instack[v]) low[u]=dfn[v];49}

50if(low[u]==dfn[u])while(v!=u);57}

58}59void solve(int

n)6076}

77int ans=0;78

for(i=1;i<=block;i++)

82 printf("

%d\n

",(ans+1)/2

);83}84

intmain()

8595

solve(n);96}

97return0;

98 }

邊雙連通分量還有橋

我發現了兩種邊雙的寫法 1.先求橋,標記橋再dfs求連通塊,似乎有點麻煩 2.直接上有向圖的寫法,把回頭的情況標記一下 其1int tarjan int x,int fa else if fa 1 i fa 1 return 0 int dfss int x return 0 scanf d lld...

雙連通分量

在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...

雙連通分量

在乙個無向連通圖中,如果任意去掉乙個定點i及依附於i的所有邊後得到的圖仍然連通,則稱該圖為 2 連通圖 否則,若得到多個連通分量,則該圖不是雙連通的,頂點i被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...