zcmu-2095
2095: 危險系數(shù)
Time Limit:?1 Sec??Memory Limit:?128 MBSubmit:?27??Solved:?18
[Submit][Status][Web Board]
Description
抗日戰(zhàn)爭時期,冀中平原的地道戰(zhàn)曾發(fā)揮重要作用。
地道的多個站點間有通道連接,形成了龐大的網(wǎng)絡(luò)。但也有隱患,當(dāng)敵人發(fā)現(xiàn)了某個站點后,其它站點間可能因此會失去聯(lián)系。
我們來定義一個危險系數(shù)DF(x,y):
對于兩個站點x和y (x != y), 如果能找到一個站點z,當(dāng)z被敵人破壞后,x和y不連通,那么我們稱z為關(guān)于x,y的關(guān)鍵點。相應(yīng)的,對于任意一對站點x和y,危險系數(shù)DF(x,y)就表示為這兩點之間的關(guān)鍵點個數(shù)。
本題的任務(wù)是:已知網(wǎng)絡(luò)結(jié)構(gòu),求兩站點之間的危險系數(shù)。
Input
輸入數(shù)據(jù)第一行包含2個整數(shù)n(2 <= n <= 1000), m(0 <= m <= 2000),分別代表站點數(shù),通道數(shù);
接下來m行,每行兩個整數(shù) u,v (1 <= u, v <= n; u != v)代表一條通道;
最后1行,兩個數(shù)u,v,代表詢問兩點之間的危險系數(shù)DF(u, v)。
Output
一個整數(shù),如果詢問的兩點不連通則輸出-1.
Sample Input
7 61 32 33 43 54 55 61 6Sample Output
2HINT
Source
第一種做法:并查集
思路:輸入的時候做并查集,判斷最后是否連通,不連通輸出-1,然后暴力每個點,看他是不是關(guān)鍵點,具體就是把pre數(shù)組重置,所有與這個點有關(guān)的邊都不連,最后a,b是否連通了,不連通就ans++;注意枚舉的點不要是a,b兩個點。。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 2e3 + 5; int u[maxn], v[maxn], pre[maxn]; int Find(int x) { return pre[x] == x ? x : pre[x] = Find(pre[x]); } void join(int x, int y) { pre[Find(x)] = Find(y); } int main() { int n, m; scanf("%d%d", &n, &m); int a, b; for(int i = 1; i <= n; i++) pre[i] = i; for(int i = 1; i <= m; i++) { scanf("%d%d", &u[i], &v[i]); join(u[i],v[i]); } scanf("%d%d", &a, &b); if(Find(a) != Find(b)) { printf("-1\n"); return 0; } int ans = 0; for(int i = 1; i <= n; i++) { if(i == a || i == b) continue; for(int k = 1; k <= n; k++) pre[k] = k; for(int j = 1; j <= m; j++) { if(i == u[j] || i == v[j]) continue; join(v[j], u[j]); } if(Find(a) != Find(b)) { ans++; } } printf("%d\n", ans); return 0; }第二種做法:bfs
既然他們能連通,那就能從一個點到另一個點。。枚舉每個點,遇到枚舉的點 直接continue就好了。??茨懿荒艿竭_y就好了。。
總結(jié)
- 上一篇: ElasticSearch快速入门(一)
- 下一篇: springcloud Feign工程熔