并查集的模板,不理解也要背下来;
#include<bits/stdc++.h> //万能头文件
using namespace std;
int par[100000],ran[10000]; //个数与深度;
int n,m;
void init(int n) //初始化; 当不需要返回值的时候,函数的类型标void。其实这个也是会返回一个值,好像是调用成功返回1,不成功返回0
{
for(int i=1;i<=n;i++)
{
par[i]=i;
ran[i]=0; //先认定所有都是单独的树根;
}
}
int find(int x) //查找根节点
{
if(x==par[x])
{
return x; //递归
}
return par[x]=find(par[x]);
}
void unite(int x,int y) //连根
{
x=find(x);
y=find(y);
if(x==y)
{
return ;
}
if(ran[x]<ran[y])
{
par[x]=y;
}
else
{
par[y]=x;
if(ran[x]==ran[y])
{
ran[x]++;
}
}
}
bool same(int x,int y) //查根
{
return find(x)==find(y);
}
int main()
{
cin>>n>>m;
int a,b; //输入连根的数;
init(n);
for(int i=1;i<=m;i++)
{
cin>>a>>b;
unite(a,b);
}
int s=0;
for(int i=1;i<=n;i++)
{
if(par[i]==i) s++;
}
cout<<s<<endl;
return 0;
1076

被折叠的 条评论
为什么被折叠?



