#include<stdio.h>
typedef struct
{
int rank; //节点对应的秩
int parent; //双亲节点,即所属的集合
}UFSTree;
/** 初始化集合,使每个节点双亲都指向自己
n为节点的个数
*/
void MakeSet(UFSTree t[],int n)
{
for(int i=0;i<n;i++)
{
t[i].parent = i;
t[i].rank = 0;
}
}
/** 递归的查找节点的双亲(即所需集合),x为待查找的节点*/
int FindSet(UFSTree t[],int x)
{
if (x!=t[x].parent)
return FindSet(t,t[x].parent);
return x;
}
/**合并两个节点所在的集合,x和y分别为所在两个集合*/
void Union(UFSTree t[],int x,int y)
{
x = FindSet(t,x); //首先找到x和y节点所在的集合的编号
y = FindSet(t,y);
if (t[x].rank>t[y].rank)
t[y].parent = x; //y所在的集合的秩小于x所在集合的秩,将y的集合并入x中
else
{
t[x].parent = y;
if (t[x].rank==t[y].rank) //若x和y的秩相同,y的秩加1
t[y].rank++;
}
}
并查集模板
最新推荐文章于 2021-11-04 14:56:41 发布