3 11
1 1 2
3 2 3
4 2
1 2 3
3 2 3
4 2
5
2 2
3 2 3
4 2
5
No
2
Yes
3
1
No
1
2
#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include<string> #include <math.h> #include<memory.h> #include<cstring> using namespace std; using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } const int INF=0x3f3f3f3f; const int maxn=1e6+10; int pre[maxn]; int fpre[maxn]; int se[maxn]; int find(int x){ if(x!=pre[x]){ pre[x]=find(pre[x]); } return pre[x]; } int n,m; int cnt,tot; void inint(){ cin>>n>>m; for(int i=1;i<=n;i++){ pre[i]=i; se[i]=1;//每个集团的人数 fpre[i]=i; } cnt=n,tot=n; } int main(){ inint(); while(m--){ int p,l,r; p=read(); if(p==1){ l=read(); r=read(); l=find(fpre[l]); r=find(fpre[r]); if(l!=r){ se[r]+=se[l]; se[l]=0; cnt--; pre[l]=r; } } else if(p==2){ l=read(); int t=find(fpre[l]); if(se[t]==1){ continue; } fpre[l]=++tot; pre[tot]=fpre[l]; se[tot]=1; se[t]--; cnt++; } else if(p==3){ l=read(); r=read(); if(find(fpre[l])==find(fpre[r])){ printf("Yes\n"); } else{ printf("No\n"); } } else if(p==4){ l=read(); int z=se[find(fpre[l])]; printf("%d\n",z); } else{ printf("%d\n",cnt); } } return 0; }
杭电:
#include"stdio.h" #include"string.h" int extra; struct A { int pre; int rep; }E[1100011]; int hash[1100011]; void build(int n) { int i; for(i=0;i<n;i++) { E[i].pre=i; E[i].rep=i; } } int find(int k) { if(E[k].pre==k) return k; E[k].pre=find(E[k].pre); return E[k].pre; } void Uninon(int a,int b) { int f1,f2; f1=find(a); f2=find(b); if(f1!=f2) E[f1].pre=f2; } void del(int a) { E[a].rep=extra; E[E[a].rep].pre=extra; extra++; } int main() { int Case=1; int n,m; int i; int a,b; char str[5]; int ans; int temp; while(scanf("%d%d",&n,&m),n||m) { build(n); extra=n; while(m--) { scanf("%s",str); if(str[0]==‘M‘) { scanf("%d%d",&a,&b); Uninon(E[a].rep,E[b].rep); } else { scanf("%d",&a); del(a); } } memset(hash,0,sizeof(int)*extra); ans=0; for(i=0;i<n;i++) { temp=find(E[i].rep); if(hash[temp]==0) { hash[temp]=1; ans++; } } printf("Case #%d: %d\n",Case++,ans); } return 0; }
https://www.xuebuyuan.com/1972286.html
原文:https://www.cnblogs.com/lipu123/p/12805931.html