#include<iostream>
using namespace std;
int father[100];
//并查集的初始化,每个元素的根结点都是自己
void initialize(int n)
{
for(int i=1;i<=n;i++)
{
father[i]=i;
}
}
//并查集的查找(循环),同一个集合中只存在一个根结点,所以就是反复地去寻找父亲结点,直到找到父亲结点
int findFather(int x)
{
while(x!=father[x])
{
x=father[x];
}
return x;
}
//并查集的查找(递归)
int findFather1(int x)
{
if(x==father[x])
{
return x;
}
else
{
return findFather1(father[x]);
}
}
//合并两个元素,先判断这两个元素在不在同一个集合(通过寻找它们的根结点进行判断),如果不相等,就把其中一个根结点指向另外一个根节点
void Union(int a,int b)
{
int faA=findFather(a);
int faB=findFather(b);
if(faA!=faB)
{
father[faA]=faB;
//father[faB]=faA也可以,两者无区别
}
}
//路径压缩
//很多时候,findFather函数只是为了找元素的根节点,那么如果只是为了查找元素的根节点,就可以想办法将每个元素的父亲结点更改为当前集合的根结点
//这样查询的效率就会大大地提升
int findFather2(int x)
{
int a=x;
while(x!=father[x])
{
x=father[x];
}
while(a!=father[a])
{
int z=a;
a=father[a];
father[z]=x;
}
return x;
}
并查集的几个基本操作
最新推荐文章于 2023-04-13 14:29:33 发布