#include <bits/stdc++.h>
using namespace std;
const int N = 4e6 + 100;
int p[N], s[N]; //s[i]是根节点为i的集合中的元素个数
int n;
void init() //初始化
{
for (int i = 1; i <= n; ++i) p[i] = i, s[i] = 1; //s[i]初始化为1
}
int find(int x)
{
if(p[x] != x) p[x] = find(p[x]); //路径压缩
return p[x];
}
void unit(int a, int b)
{
p[a] = b;
s[b] += s[a]; //维护根节点的s
}
int main()
{
IOS;
int m;
cin >> n;
cin >> m;
init();
while (m --)
{
int a, b;
cin >> a >> b;
int r1 = find(a), r2 = find(b);
if(r1 != r2)
unit(r1, r2);
}
for(int i = 1; i <= n; i ++)
cout << s[find(i)] << " ";
}
连通块中点的数量模板(并查集 + 维护集合元素个数)
最新推荐文章于 2024-05-16 18:11:19 发布