3046: 招商银行网络系统
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte
Total Submit: 12 Accepted:3
Total Submit: 12 Accepted:3
Description
虽然招商银行的网络安全已经做得非常完善,但是天有不测风云,招商银行内部网络系统的一台服务器意外感染了一种新型病毒。为了避免更大的损失,管理员必须采取紧急措施遏制病毒的蔓延。
招商银行内部网络系统共有n台服务器,这n台服务器使用m条电缆互相连接。为了描述方便,我们给服务器编号1到n。初始时,1号服务器感染了病毒。每隔一分钟,病毒便会从已感染病毒的服务器扩散到所有与之直接相连的服务器上。
招商银行的网络系统设计得非常坚固,即使要切断电缆也非常困难。管理员只能在初始时切断一根电缆。为了让整个网络系统尽可能晚地全部被病毒感染,他应该切断哪根电缆?
Input
输入包含多组数据。
每组数据的第一行是两个整数n和m (2≤n≤200, 1≤m≤n*(n-1)/2),其含义如上面所描述。
接下来m行每行两个整数a, b (1≤a, b≤n),表示服务器a和服务器b有电缆直接连接。任意两台服务器间至多有一根电缆相连。
输入数据以n=m=0结束。
Output
对每组数据输出最晚多少分钟之后整个网络系统被感染。如果切断某根电缆后病毒永远不会传播到某些服务器,那么输出”Great”。
Sample Input
4 5
1 2
2 3
3 4
4 1
1 3
4 4
1 2
2 3
3 4
1 3
0 0
Sample Output
2
Great
可以想到其实就是到1的最短路
可以想到m*m的,但是肯定会超时的啊。不过影响bfs其实就是bfs树上的路径,去枚举这些路径就是n*m的复杂度了
#include <bits/stdc++.h> using namespace std; #define fi first #define se second const int N=205; vector<int>G[N]; vector<pair<int,int>>E; int vis[N],n,cnt,ans; void bfs(int s,int t) { memset(vis,0,sizeof vis),cnt=0; queue<pair<int,int>>Q; Q.push({1,0}),vis[1]=1; while(!Q.empty()) { pair<int,int> x=Q.front(); Q.pop(),ans=max(ans,x.se),cnt++; for(auto X:G[x.fi]) if(!vis[X]&&(!(X==s&&x.fi==t||X==t&&x.fi==s)))Q.push({X,x.se+1}),vis[X]=1; } } void la() { for(int i=0; i<n-1; i++) { bfs(E[i].fi,E[i].se); if(cnt<n) { cout<<"Great "; return; } } cout<<ans<<" "; } int main() { int m,x; while(cin>>n>>m,n||m) { ans=0,E.clear(),memset(vis,0,sizeof vis); for(int i=0,u,v; i<m; i++)cin>>u>>v,G[u].push_back(v),G[v].push_back(u); queue<int>Q; Q.push(1),vis[1]=1; while(!Q.empty()) { x=Q.front(),Q.pop(); for(auto X:G[x])if(!vis[X])Q.push(X),E.push_back({x,X}),vis[X]=1; } la(); for(int i=1; i<=n; i++)G[i].clear(); } }