#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; }
这题不好做的就是如何判断连通性的变化 如何衡量他
我们可以记录删除点之前的联通快数量 然后在删除点之后搜索不同的联通块的数量 (不包括摧毁的城市)
如果这个数量小了那么有可能是少了本来就是孤立的摧毁的城市
而数量变大了 一定就是联通性变化了 那么红色警戒
每次跟上一次摧毁城市的联通块数对比 这样一旦有城市摧毁导致联通块增多 那么必然表示这里连通性改变
暴力风...嗯...