#include<iostream> #include<set> using namespace std; const int maxn=2000005; int f[maxn],id[maxn]; int n,cas,cnt; set<int>s; void init() { int i; for(i=0;i<n;i++) { id[i]=i; } for(i=0;i<maxn;i++) { f[i]=i; } cnt=n; } int find(int x) { if(f[x]!=x) f[x]=find(f[x]); return f[x]; } void merge(int x,int y) { int fx,fy; fx=find(x); fy=find(y); if(fx!=fy) f[fx]=fy; } void outit() { int i; s.clear(); for(i=0;i<n;i++) { s.insert(find(id[i])); } printf("Case #%d: %d\n",++cas,s.size()); } int main() { cas=0; int m,a,i,b; char ch[5]; while(scanf("%d%d",&n,&m)&&n+m) { init(); for(i=1;i<=m;i++) { scanf("%s",ch); if(ch[0]=='M') { scanf("%d%d",&a,&b); merge(id[a],id[b]); } else { scanf("%d",&a); id[a]=cnt++; } } outit(); } return 0; }
《并查集》hdu acm 5.1.6 c++ set
最新推荐文章于 2020-01-31 01:10:43 发布