题目:

思路分析:
第一思路就是并查集吧!
没错相信自己 是不是想到要拆边!(可是并查集并没有这操作呀!
那怎么呢
1.反向建图(这个好实现 就不写了
2.多次更新 和上一次的更新的状态量比较 就是比二者的连通块的数量
数据不大 完全可以实现!
代码实现:
const int MAX=10010;
int vis[MAX];
int fa[MAX];
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void add(int x,int y){
int xx=find(x);
int yy=find(y);
if(xx==yy) return;
fa[xx]=yy;
}
struct node{
int a,b;
}e[MAX];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
fa[i]=i;
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
e[i].a=u;
e[i].b=v;
add(u,v);
}
int ans1=0;
int ans2=0;
for(int i=0;i<n;i++){
if(i==fa[i])
ans1++;
}
int k;
cin>>k;
while (k--) {
ans2=0;
for(int i=0;i<n;i++)
fa[i]=i;
int x;
cin>>x;
vis[x]=1;
for(int i=0;i<m;i++){
int a=e[i].a;
int b=e[i].b;
if(vis[a]||vis[b])continue;
add(a,b);
}
for(int i=0;i<n;i++)
if(fa[i]==i)
ans2++;
if(ans1==ans2||ans1+1==ans2)
cout<<"City "<<x<<" is lost."<<endl;
else cout<<"Red Alert: City "<<x<<" is lost!"<<endl;
ans1=ans2;
}
int num=0;
for(int i=0;i<n;i++){
if(i==fa[i])
num++;
}
if(num==n){
cout<<"Game Over."<<endl;
}
}
2828



被折叠的 条评论
为什么被折叠?



