/*
* 并查集
*
* */
#include <stdio.h>
int father[7];
//初始化
void init()
{
for(int i=1;i<7;i++)
{
father[i]=i;
}
}
//查找根节点
int findFather(int x)
{
if(x==father[x])
return x;
else return findFather(father[x]);
}
//合并集合
void Union(int x,int y)
{
int faA=findFather(x);
int faB=findFather(y);
if(faA!=faB)
{
//根节点不同说明不是同一个集合 进行合并
father[faA]=faB;
//faA的根节点设为faB
}
}
//路径压缩
//1.先查找x根节点
//2.将查找x路径上所有节点父节点设置为根节点
void changeFather(int x)
{
int a=x;
x = findFather(x);
//修改路径上节点的根节点
while(a!=father[a])
{
int z=a;
//回溯父节点
a=father[a];
//修改父节点为根节点
father[z]=x;
}
}
int main()
{
init();
for(int i=1;i<7;i++)
{
printf("%d-->%d ",i,father[i]);
}
printf("\n4的根节点:%d\n",findFather(4));
//合并集合
Union(4,6);
for(int i=1;i<7;i++)
{
printf("%d-->%d ",i,father[i]);
}
printf("\n4的根节点:%d\n",findFather(4));
//路径压缩
changeFather(4);
for(int i=1;i<7;i++)
{
printf("%d-->%d ",i,father[i]);
}
printf("\n4的根节点:%d\n",findFather(4));
}
并查集 初始化 查找 合并 路径压缩
最新推荐文章于 2023-10-21 12:47:41 发布