日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zcmu-2095

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 zcmu-2095 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
不忘初心,砥礪前行!

2095: 危險系數

Time Limit:?1 Sec??Memory Limit:?128 MB
Submit:?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 6

Sample Output

2

HINT

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就好了。。

#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<vector> #include<map> #include<list> #include<stack> #include<queue> #include<algorithm> using namespace std;const int M=10000+10;vector<int> v[M]; int n,m,x,y; int book[M];int bfs(int p) {memset(book,0,sizeof(book));book[p]=1;queue<int> q;q.push(x);while(!q.empty()){int a=q.front();q.pop();if(a==y)return 0;//如果不經過p點還是可以到y,說明這點不是關鍵點,返回0;for(int i=0; i<v[a].size(); i++){int z=v[a][i];if(!book[z]){book[z]=1;q.push(z);}}}return 1;} int main() {scanf("%d%d",&n,&m);for(int i=0; i<m; i++){int t,l;scanf("%d%d",&t,&l);v[t].push_back(l);v[l].push_back(t);}scanf("%d%d",&x,&y);int temp=bfs(0),i;int ans=0;if(temp)puts("-1");else{for(i=1; i<=n; i++)if(i!=x&&i!=y)ans+=bfs(i);}printf("%d\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的zcmu-2095的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。