思路:和poj的一道題有點像,不過這道題圖可能不連通,因此首先求邊雙連通分量,然後算每個連通分量的度數,顯然葉子節點的度數為1,孤立點的度數為0,然後就是統計度數了,對於孤立點ans+=2,對於葉子節點,ans++。於是最後的答案就是(ans+1)/2了。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7view codeusing
namespace
std;
8#define maxn 1111910
intn, m, cnt, _count;
11 stack s;
12 vector int > >g;
1314
intlow[maxn], dfn[maxn], color[maxn];
15int
degree[maxn];
16bool
mark[maxn];
17void tarjan(int u, int
father)
18 else
if(mark[v]) 31}
32if(low[u] ==dfn[u])while(x !=u);41}
42}4344
intmain()
4555 memset(dfn, 0, sizeof
(dfn));
56 memset(mark, false, sizeof
(mark));
57 cnt = _count = 0;58
for(int i = 1; i <= n; i ++)
61if(_count == 1
)65 memset(degree, 0, sizeof
(degree));
66for(int i = 1; i <= n; i++)70}
71 ans = 0;72
for(int i = 1; i <= _count; i++)
76 printf("
%d\n
", (ans + 1)/2
);77}78
return0;
79 }
邊雙連通分量還有橋
我發現了兩種邊雙的寫法 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被稱為 割點 簡單的說,在雙連通圖中,任何一對頂點都至少存在兩條路徑可以互相到達。圖的連通 性不會任何乙個頂點的影響。這個性質具有許多重要的應用...