题目链接:https://acm.njupt.edu.cn/problem/CF1167C/editor
解题思路:简单的并查集问题,根据条件找到所有的关联块,然后输出每一个人属于的块的大小即可
#include<cstdio>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
const int maxn=5e5+10;
int n,m;
int vis[maxn];
int pa[maxn];
int rk[maxn];
int find(int x){
return pa[x]==x?x:find(pa[x]);
}
void unite(int x,int y){
x=find(x),y=find(y);
if(x==y) return ;
if(rk[x]<rk[y]){
pa[x]=y;
rk[y]+=rk[x];
}
else{
pa[y]=x;
rk[x]+=rk[y];
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) pa[i]=i,rk[i]=1;
for(int i=1;i<=m;i++){
int k,fa,son;
scanf("%d",&k);
if(k==0) continue;
scanf("%d",&fa);
for(int j=1;j<k;j++){
scanf("%d",&son);
unite(fa,son);
}
}
for(int i=1;i<=n;i++)
printf("%d ",rk[find(i)]);
return 0;
}
不带权的并查集题目:
Wireless Network POJ - 2236 https://vjudge.net/problem/POJ-2236