以L2-013 红色警报为例
原题链接
https://pintia.cn/problem-sets/994805046380707840/exam/problems/994805063963230208?type=7&page=1
下面贴上代码
#include<iostream> using namespace std; const int N=510; int p[N],g[N][N]; int find(int x) { if(x!=p[x]) p[x]=find(p[x]); return p[x]; } int main() { int n,m; cin>>n>>m; for(int i=0;i<n;i++) p[i]=i;//初始化 while(m--) { int a,b; cin>>a>>b; p[find(a)]=find(b); g[a][b]=g[b][a]=1;//标记 } int k,x,cnt1=0;//cnt1记录攻占前的连通分量个数 for(int i=0;i<n;i++) if(find(i)==i) cnt1++; cin>>k; while(k--) { int cnt2=0;//cnt2记录攻占后的连通分量个数 cin>>x; for(int i=0;i<n;i++) g[x][i]=g[i][x]=0;//攻占之后取消标记 for(int i=0;i<n;i++) p[i]=i;//重新初始化 for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(g[i][j]) p[find(i)]=find(j); for(int i=0; i<n;i++) if(find(i)==i) cnt2++; if(cnt2-cnt1>1) printf("Red Alert: City %d is lost!\n",x); else printf("City %d is lost.\n",x); cnt1=cnt2;//更新攻占前的连通分量 } if(cnt1==n) cout<<"Game Over.";//表示全部不连通 return 0; }标签:连通,int,查集,cnt2,cnt1,分量,find,逆序 From: https://www.cnblogs.com/1DeomS2/p/18105359