大意:給定乙個無向連通圖,判斷至少加多少的邊,才能使任意兩點之間至少有兩條的獨立的路(沒有公共的邊,但可以經過同乙個中間的頂點)。
思路:在同乙個雙連通分量裡的所有的點可以看做乙個點,收縮後,新圖是一棵樹,樹的邊便是原圖的橋。現在問題轉化為「在樹中至少新增多少條邊能使圖變成邊雙連通圖」,即新增的邊的個數=(樹中度為一的節點數目+1)/2,用trajan演算法求雙聯通分量
這是乙個模板
1 #include2 #include3 #include4 #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被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...