#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int maxn=1e5+10;
using namespace std;
int f[maxn];
void init(int n)
{
for(int i=1; i<=n; i++) f[i]=i;
}
int find(int u)
{
if (f[u]==u) return u;
else return f[u]=find(f[u]);
}
void unions(int u,int v)
{
int U=find(u);
int V=find(v);
f[U]=V;
}
int count(int n)
{
int ret=0;
for(int i=1; i<=n; i++)
{
f[i]=find(i);
if (f[i]==i) ret++;
}
return ret;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=-1)
{
init(n);
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
unions(u,v);
}
printf("%d\n",count(n));
for(int i=1; i<=n; i++) printf("%d : %d\n",i,f[i]);
}
return 0;
}
UFS并查集 模板
最新推荐文章于 2022-08-31 21:56:59 发布