/*
題目描述:給出一張無向圖,分別求出圖中滿足如下兩種條件的邊的數量:
1、該邊不在任何簡單環當中;
2、該邊在多個簡單環當中;
方法:不在任何簡單環當中的,就是圖中的橋,可以求出來;
通過簡單環聯想到點雙連通分量,找到某個雙連通分量,若該雙連通分量包含的邊數超過該點雙連通分量包含的點數,那麼這個雙
連通分量中的每條邊都是滿足條件2的邊;
綜上,用dfs求出橋的數量與上述雙連通分量中的邊數輸出即可;
可以套用求雙連通分量的模板來求上述二者
求橋:在滿足割點條件時額外判斷是不是橋,若是,橋的數量+1;
求bcc中的邊數:在dfs的過程中,需要從棧中取出該分量中的每一條邊,每取出一條,邊數+1,最後判斷邊數是否大於該分量中的
點數,若是,將該分量邊數的總和加到ans中,最終ans就是答案;
*/#include#include#include#include#include#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
const int maxn = 10000 + 5;
struct edge
;int iscut[maxn],pre[maxn],bccno[maxn],dfs_clock,bcc_cnt,bridge,ans;
vectorg[maxn] , bcc[maxn];
stacks;
int dfs(int u , int fa)
if(bccno[x.v]!=bcc_cnt)
if(x.u==u &&x.v == v)
}if(add > bcc[bcc_cnt].size()) //該bcc中邊數大於點數,ans加上add
ans += add;}}
else if(pre[v]}
if(fa < 0 &&child == 1) iscut[u] = 0;
return lowu;
}void find_bcc(int n)
int main()
find_bcc(n);
printf("%d %d\n",bridge , ans);
}return 0;
}
HDU 3394 Railway(點雙連通分量)
description 給乙個無向圖,如果至少有兩個環共用了一些邊,那麼這些邊被認為是衝突邊,如果一些邊不在任何乙個環中,這些邊被認為是多餘邊,問這個圖中有多少多餘邊和衝突邊 input 多組用例,每組用例第一行為兩個整數n和m表示該無向圖的點數和邊數,之後m行每行兩個整數u,v表示u和v之間有一條...
HDU3394 Railway 點雙連通分量
題意 給出乙個無向圖,求出它的衝突邊數和多餘邊數,衝突邊就是那些同時存在於多個環中的邊,而多餘邊是不在任何乙個環中的邊.要點 多餘邊很明顯就是橋,我們可以推斷除衝突邊只能在點雙連通分量中,感覺邊雙應該也行,主要就是求出分量後看分量中點數n和邊數m的關係,如果n include include inc...
HDU 3394 Railway 點雙連通分量
題意 給定乙個無向圖,找出不在任意乙個環上的邊數和同時在多個環上的邊數。思路點 雙連通分量如果在邊數等於點數,那麼形成乙個環,邊數多於點數,說明環中有多條邊。include include include include include include include include include...