您的位置:首页 > 其它

并查集模板

2012-12-31 12:48 190 查看
#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++;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: