并查集路径压缩和按rank合并代码实现

1、子集结构体:parent为每个子集的根,rank为秩
在这里插入图片描述
在这里插入图片描述

struct Subset
{
	int parent;
	int rank;
}; 

2、初始化:
一开始每个顶点自成一个子集,它们的parent指向自身,rank初始化为0

Subset* makeSet(int n)
{
	Subset *subset = new Subset[n];
	for(int i = 0; i < n; i++)
	{
		subset[i].parent = i;
		subset[i].rank = 0;
	}
	return subset; 
} 

3、查找:查找的时候路径压缩subsets[i].parent = find(subsets, subsets[i].parent);

int find(Subset subsets[], int i)	
{
	if(subsets[i].parent != i)
	{
		subsets[i].parent = find(subsets, subsets[i].parent);		//路径压缩 
	}
	return subsets[i].parent;
}

4、给定两个集合的根rank值作比较,rank值小的合并到rank值大的集合里去

void unionSet(Subset subsets[], int x, int y)
{
	int xroot = find(subsets, x);
	int yroot = find(subsets, y);
	if(xroot == yroot)
	{
		return ;
	} 
	if(subsets[xroot].rank < subsets[yroot].rank)
	{
		subsets[xroot].parent = yroot;
	}
	else if(subsets[xroot].rank > subsets[yroot].rank)
	{
		subsets[yroot].parent = xroot;
	}
	else
	{//subsets[xroot].rank > subsets[yroot].rank
		subsets[yroot].parent = xroot;
		subsets[xroot].rank++;
	}
}

5、把他们放到类里的话:

class Subset
{
public:
	int* parent;
	int* rank;
	Subset(int n)
	{
		parent = new int[n];
		rank = new int[n];
		for (int i = 0; i < n; i++)
		{
			parent[i] = i;
			rank[i] = 0;
		}
	}
	int find(int x)			//找x的root 
	{
		if (parent[x] != x) 
		{
			parent[x] = find(parent[x]);	//压缩路径 
		}
		return parent[x];
	}
	void unionSet(int x, int y)
	{//将x和y所在集合合并
		int xroot = find(x);			 
		int yroot = find(y);
		if(xroot == yroot)
		{
			return;
		}
		
		if (rank[xroot] < rank[yroot])
		{
			parent[xroot] = yroot;
		}
		else if (rank[xroot] > rank[yroot])
		{
			parent[yroot] = xroot;
		}
		else
		{//rank[xroot] == rank[yroot]
			parent[yroot] = xroot;
			rank[xroot]++;
		}
	}
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值