#include<bits/stdc++.h>
using namespace std;
bool bok[510],des[510];
vector<int>g[510];
void dfs(int s){
for(int i=0;i<g[s].size();i++)
if(!bok[g[s][i]]&&!des[g[s][i]]){
bok[g[s][i]]=1;
dfs(g[s][i]);
}
}
int main(){
int n,m;
cin>>n>>m;
while(m--){
int s,e;
cin>>s>>e;
g[s].push_back(e);
g[e].push_back(s);
}
int cnt=0;
for(int i=0;i<n;i++)
if(!bok[i]){
dfs(i);
bok[i]=1;
cnt++;
}
int q;
cin>>q;
int city =n;
while(q--){
int t;
cin>>t;
des[t]=1;
city--;
int c=0;
memset(bok,0,sizeof(bok));
for(int i=0;i<n;i++){
if(!bok[i]&&!des[i]){
c++;
bok[i]=1;
dfs(i);
}
}
if(c>cnt)cout<<"Red Alert: City "<<t<<" is lost!"<<endl;
else cout<<"City "<<t<<" is lost."<<endl;
cnt = c;
}
if(city==0)cout<<"Game Over."<<endl;
return 0;
}
这题不好做的就是如何判断连通性的变化 如何衡量他
我们可以记录删除点之前的联通快数量 然后在删除点之后搜索不同的联通块的数量 (不包括摧毁的城市)
如果这个数量小了那么有可能是少了本来就是孤立的摧毁的城市
而数量变大了 一定就是联通性变化了 那么红色警戒
每次跟上一次摧毁城市的联通块数对比 这样一旦有城市摧毁导致联通块增多 那么必然表示这里连通性改变
暴力风...嗯...