hdu3394Railway 雙連通分量

2021-07-16 03:30:25 字數 1154 閱讀 4421

/*

題目描述:給出一張無向圖,分別求出圖中滿足如下兩種條件的邊的數量:

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...