每次都要初始化
然后并查集统计连通块的数量
如果重新连然后统计一遍之后,数量比last多1,或不变都是不改变连通性的
用cnt来统计陷落的城市
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4;
const int inf=510;
int vis[inf],f[inf];
int cnt=0;
typedef pair<int,int> PII;
void init()
{
for(int i=0;i<inf;i++)
f[i]=i;
}
int find(int x)
{
while(x!=f[x])
x=f[x];
return x;
}
void mer(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx>fy)
f[fx]=fy;
else
f[fy]=fx;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
vector<PII> ve;
init();
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
ve.push_back({a,b});
mer(a,b);
}
set<int> ss;
int last=0;
for(int i=0;i<n;i++)
{
ss.insert(find(i));
}
last=ss.size();
int q;
scanf("%d",&q);
while(q--)
{
int x;
scanf("%d",&x);
if(!vis[x])
cnt++;
vis[x]=1;
int te=0;
init();
set<int> st;
for(int j=0;j<ve.size();j++)
{
int a=ve[j].first;
int b=ve[j].second;
if(vis[a]||vis[b])
continue;
else
mer(a,b);
}
for(int i=0;i<n;i++)
{
st.insert(find(i));
}
if(st.size()==last+1||st.size()==last)
printf("City %d is lost.\n",x);
else
printf("Red Alert: City %d is lost!\n",x);
last=st.size();
if(cnt==n)
printf("Game Over.\n");
}
}