并查集代码模板:
#include<bits/stdc++.h>
using namespace std;
int f[100000];
void init(int n)//初始化
{
int i;
for(i=1;i<=n;i++)
{
f[i]=i;
}
}
int getf(int v)//找父节点
{
if(f[v]==v)
//若父亲是本身,则表示已找到最终父节点
{
return v;
}
else
{
f[v]=getf(f[v]);
//路径压缩,递归找到最终父节点
return f[v];
//返回根节点
}
}
void merge1(int v,int u)//合并
{
int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)//若两个节点不在同一集合内(父节点不同)
{
f[t2]=t1;//合并
//靠左原则,将右边的集合,作为左边集合的子集合
}
}
int main()
{
int N,M;
cin>>N>>M;//N个节点,M对组合
init(N);//初始化
int x,y;
for(int i=1;i<=M;i++)
{
cin>>x>>y;
merge1(x,y);
}
int sum=0;//sum为集合个数
for(int i=1;i<=N;i++)
{
if(f[i]==i)
{
sum++;
}
}
cout<<sum<<"\n";
}