并查集

并查集

#include <bits/stdc++.h>
using namespace std;
const int maxn=9999999;
int pre[maxn],n;
int find(int x)//递归 
{
	//如果自己的上级不是自己,就去找到自己的最高级 
	if(pre[x]!=x)	pre[x]=find(pre[x]);
	return pre[x];
}
/*int find(int x)//循环
{
	int temp,p=x;
	while(x!=pre[x])//只要没到最高级
		x=pre[x];
	while(p!=x)//将沿途的节点的上一节点都设置为最高级 
	{
		temp=pre[p];//我们要修改成最高级,但要保存下当前值 
		pre[p]=x;
		p=temp;	
	}
	return x;		
} */
void join(int q,int w) 
{
	pre[find(q)]=find(w);//将q的最高级本来指向自己,现在令它指向w的最高级 
	return;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		pre[i]=i;//开始时父节点为自己 
	return 0;
} 
原文地址:https://www.cnblogs.com/iss-ue/p/12679631.html