#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
int f[507];
int vis[5007]={0};
int a[5007],b[5007];
int _find(int d)
{
if(f[d]!=d)
return f[d]=_find(f[d]);//路经压缩
return f[d];
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
f[i]=i;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a[i],&b[i]);
int fa=_find(a[i]);//找父节点
int fb=_find(b[i]);
if(fa!=fb) f[fa]=fb;//父节点不一样合并
}
int num=0,numnew=0;//num 未失城之前集合个数 numnew失城之后集合个数
for(int i=0;i<n;i++)
if(f[i]==i)
num++;
int k;
scanf("%d",&k);
for(int cas=0;cas<k;cas++)
{
for(int i=0;i<n;i++)
f[i]=i;
numnew=0;
int c;
scanf("%d",&c);
vis[c]=1;
for(int i=0;i<m;i++)//m条边
{
if(vis[a[i]]) continue;
if(vis[b[i]]) continue;
int fa=_find(a[i]);
int fb=_find(b[i]);
if(fa!=fb) f[fa]=fb;
}
for(int i=0;i<n;i++)
if(f[i]==i&&vis[i]==0)
numnew++;
if(num==numnew||(numnew+1)==num) printf("City %d is lost.\n",c);
else printf("Red Alert: City %d is lost!\n",c);
num=numnew;
}
if(k==n) printf("Game Over.\n");
}
红色警报(并查集)
最新推荐文章于 2025-04-23 21:35:08 发布