acwing837连通块中点的数量,并查集
在普通并查集加上一个记录点数的size,只有头的size有意义
#include <bits/stdc++.h> using namespace std; const int N=100005; int n,m,a,b; char op[5]; int fa[N],size[N]; int find(int a){ if(fa[a]!=a) fa[a]=find(fa[a]); return fa[a]; } int main(int argc, char** argv) { cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i, size[i]=1; for(int i=1;i<=m;i++){ scanf("%s",op); if(op[0]=='C'){//合并 scanf("%d%d",&a,&b); if(find(a)!=find(b)) size[find(a)]+=size[find(b)]; fa[find(b)]=fa[find(a)];//原本是fa[find(a)]=fa[find(b)],结果错误但是上面是把头挂在a,原来这句就是把头挂在b }else if(op[1]=='1'){//a,b是否在同一集合 scanf("%d%d",&a,&b); printf("%s\n",find(a)==find(b)?"Yes":"No"); }else {//a所在集合有多少点 scanf("%d",&a); printf("%d\n",size[find(a)]); } } return 0; }