简单并查集
#include <iostream>
using namespace std;
const int MAXN=555;
struct node
{
int x,y;
}nd[5555];
int num[MAXN];
int find(int t)
{
while(num[t]!=t)
t=num[t];
return t;
}
void un(int t1,int t2)
{
int x=find(t1);
int y=find(t2);
if(x<y)
num[y]=x;
else num[x]=y;
}
int vis[MAXN];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
num[i]=i;
for(int i=0;i<m;i++)
{
int t1,t2;
cin>>t1>>t2;
nd[i].x=t1,nd[i].y=t2;
un(t1,t2);
}
int cont1=0;
for(int i=0;i<n;i++)
if(num[i]==i)
cont1++;
int k;
cin>>k;
for(int i=0;i<k;i++)
{
int cont2=0;
int t3;
cin>>t3;
vis[t3]=1;
for(int j=0;j<n;j++)
num[j]=j;
for(int j=0;j<m;j++)
{
if(!vis[nd[j].x]&&!vis[nd[j].y])
un(nd[j].x,nd[j].y);
}
for(int j=0;j<n;j++)
if(num[j]==j&&!vis[j])
cont2++;
if(cont2==cont1||cont2+1==cont1)
printf("City %d is lost.\n",t3);
else printf("Red Alert: City %d is lost!\n",t3);
if(i==n-1)
printf("Game Over.\n");
cont1=cont2;
}
return 0;
}