一个并查集的问题。
先把边全部存起来,然后记录节点是否被攻占。然后用这些边,去掉被攻占的节点。重复建图。不断比较。
#include<bits/stdc++.h>
using namespace std;
struct node
{
int w,v;
};
node link[5005];
int n,m,k,last,now;
int pa[505],live[505];
int findpa(int x)
{
return x==pa[x]?x:pa[x]=findpa(pa[x]);
}
void merg(int x,int y)
{
int px,py;
px=findpa(x);
py=findpa(y);
if(px!=py)
pa[py]=px;
}
void make_merge()
{
for(int i=0; i<n; i++)
pa[i]=i;
for(int i=0; i<m; i++)
if(live[link[i].w]&&live[link[i].v])
merg(link[i].w,link[i].v);
}
int cntall()
{
int cnt=0;
for(int i=0; i<n; i++)
if(live[i]&&findpa(i)==i)
cnt++;
return cnt;
}
int main()
{
memset(live,1,sizeof(live));
cin>>n>>m;
for(int i=0; i<m; i++)
cin>>link[i].w>>link[i].v;
make_merge();
last=now=cntall();
cin>>k;
for(int i=0; i<k; i++)
{
int id;
int flag=0;
cin>>id;
live[id]=0;
make_merge();
now=cntall();
if(now>last)
flag=1;
if(flag)
printf("Red Alert: City %d is lost!\n",id);
else printf("City %d is lost.\n",id);
last=now;
}
now=0;
for(int i=0;i<n;i++)
if(live[i]==0)
now++;
if(now==n)
printf("Game Over.\n");
return 0;
}
需要注意的是,Game Over的输出。。当时因为这个错到怀疑人生