并查集:判断无向图连通分量个数(或判断无向图中任何两个顶点是否连通)
有一点要注意:如果一个结点被占领后,现有的连通分量个数=原连通分量个数 或者 现有的连通分量个数=原连通分量个数+1,都是说明去掉当前结点是无影响的
int fa[505];
int n,m;
int visit[505];
struct node
{
int u,v;
}e[5005];
int Find(int x)
{
if(fa[x]==x)
return fa[x];
else
return fa[x]=Find(fa[x]);
}
void Union(int x,int y)
{
int xc=Find(x);
int yc=Find(y);
if(xc!=yc)
fa[xc]=yc;
}
while(cin>>n>>m)
{
for(int i=0;i<n;i++){
fa[i]=i;
}
for(int i=0;i<m;i++){
cin>>u>>v;
e[i].u=u;
e[i].v=v;
Union(u,v);
}
int num=0,num1=0;
for(int i=0;i<n;i++){
if(fa[i]==i)
num++; //连通分量个数
}
memset(visit,0,sizeof(visit));
cin>>k;
while(k--){
num1=0;
for(int i=0;i<n;i++)
fa[i]=i;
int x;
cin>>x;
visit[x]=1;
for(int i=0;i<m;i++){
if(visit[e[i].u]==1||visit[e[i].v]==1)
continue;
else
Union(e[i].u,e[i].v);
}
for(int i=0;i<n;i++){
if(fa[i]==i)
num1++;
}
if(num==num1||num+1==num1)
cout<<"City "<<x<<" is lost."<<endl;
else
cout<<"Red Alert: City "<<x<<" is lost!"<<endl;
num=num1;
}