暴力,并查集。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int n=1e4;
int a,b,c,d[n],l,r,e,q[n];
vector<int>t[n];
int find(int x)
{
if(d[x]!=x) d[x]=find(d[x]);
return d[x];
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>a>>b;
for(int i=1;i<=a;i++)
{
d[i]=i;
}
int an=0;
for(int i=1;i<=b;i++)
{
cin>>l>>r;
int f=find(l);
int h=find(r);
if(f!=h)
{
d[f]=h;
}
t[l].push_back(r);
t[r].push_back(r);
}
for(int i=0;i<a;i++)
{
if(d[i]==i)
{
an++;
}
}
//cout<<an<<endl;
cin>>c;
for(int i=1;i<=c;i++)
{
cin>>l;
q[l]=1;
t[l].clear();
for(int j=0;j<a;j++)
{
d[j]=j;
}
for(int j=0;j<a;j++)
{
int g=find(j);
for(int w:t[j])
{
if(q[w]==1)
continue;
int p=find(w);
if(g!=p)
{
d[p]=g;
}
}
}
int v=0;
for(int j=0;j<a;j++)
{
if(d[j]==j&&q[j]==0)
{
v++;
}
}
//cout<<v<<endl;
if(v>=an+1)
{
printf("Red Alert: City %d is lost!\n",l);
}
else
{
printf("City %d is lost.\n",l);
}
if(i==a)
{
printf("Game Over.\n");
}
an=v;
}
}