zcmu-2095
不忘初心,砥礪前行!
Submit:?27??Solved:?18
[Submit][Status][Web Board]
2095: 危險系數
Time Limit:?1 Sec??Memory Limit:?128 MBSubmit:?27??Solved:?18
[Submit][Status][Web Board]
Description
抗日戰爭時期,冀中平原的地道戰曾發揮重要作用。
地道的多個站點間有通道連接,形成了龐大的網絡。但也有隱患,當敵人發現了某個站點后,其它站點間可能因此會失去聯系。
我們來定義一個危險系數DF(x,y):
對于兩個站點x和y (x != y), 如果能找到一個站點z,當z被敵人破壞后,x和y不連通,那么我們稱z為關于x,y的關鍵點。相應的,對于任意一對站點x和y,危險系數DF(x,y)就表示為這兩點之間的關鍵點個數。
本題的任務是:已知網絡結構,求兩站點之間的危險系數。
Input
輸入數據第一行包含2個整數n(2 <= n <= 1000), m(0 <= m <= 2000),分別代表站點數,通道數;
接下來m行,每行兩個整數 u,v (1 <= u, v <= n; u != v)代表一條通道;
最后1行,兩個數u,v,代表詢問兩點之間的危險系數DF(u, v)。
Output
一個整數,如果詢問的兩點不連通則輸出-1.
Sample Input
7 61 32 33 43 54 55 61 6Sample Output
2HINT
Source
第一種做法:并查集
思路:輸入的時候做并查集,判斷最后是否連通,不連通輸出-1,然后暴力每個點,看他是不是關鍵點,具體就是把pre數組重置,所有與這個點有關的邊都不連,最后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就好了。。
總結
- 上一篇: ElasticSearch快速入门(一)
- 下一篇: springcloud Feign工程熔