Professional Manager
题意:给定4种操作:
1,合并u,v.
2,移除u.
3,查询u集合里元素的个数.
4,判断u,v是否在一个集合里.
思路:并查集
#include<bits/stdc++.h>
using namespace std;
int fa[100005],d[100005],pre[100005];
int find(int x){
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void unionset(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
fa[fy]=fx;
d[fx]+=d[fy];
}
}
int main(){
int T;
scanf("%d",&T);
for(int j=1;j<=T;j++){
printf("Case #%d:\n",j);
int n,q;
scanf("%d%d",&n,&q);
for(int i=0;i<=100000;i++){
fa[i]=i;
d[i]=1;
pre[i]=i;
}
int num=n+1;
while(q--){
int op;
scanf("%d",&op);
int u,v;
if(op==1){
scanf("%d%d",&u,&v);
unionset(pre[u],pre[v]);
}
if(op==2){
scanf("%d",&u);
v=find(pre[u]);
d[v]--;
pre[u]=num++;
}
if(op==3){
scanf("%d",&u);
v=find(pre[u]);
printf("%d\n",d[v]);
}
if(op==4){
scanf("%d%d",&u,&v);
u=find(pre[u]),v=find(pre[v]);
if(u==v)
puts("YES");
else puts("NO");
}
}
}
}