并查集

并查集

问题:说白了就是 领导 的领导 还是领导

假设有一个数组 Leader[1000],代表着某个世界里有 1000 个人
而在这个世界上每个人只有一个Leader,并且在数组的值中记录着
比如 Leader[15] = 58 意味着 id = 15 的人,他的 leader 是 id = 58 的那个
如果 Leader[66] = 66 意味着 id = 66 的这个人是某家公司得到最高总裁

如何按照不同公司将这些人分开呢?只能依靠总裁了

int unionsearch(int root) //输入某人 id,返回总裁 id
{
	int son, tmp;
	son = root;
	while(root != pre[root]) //直到找到总裁,return
		root = pre[root];
	return root;
}

但是每次查找都要费了九牛二虎之力,那么就在每次查找时候将leader的leader也换成总裁吧,即路径压缩

int unionsearch(int root) //输入某人 id,返回总裁 id
{
	int son, tmp;
	son = root;
	while(root != pre[root]) //找到了总裁
		root = pre[root];
	while(son != root) //把这一路上问过的leader的领导都改成总裁
	{
		tmp = pre[son];
		pre[son] = root;
		son = tmp;
	}
	return root;
}

在商场上,公司合并可是常态,假设某两个经理签署了合并协议,那这两个公司所有人都成了一家人,当然新总裁是谁还是要看上帝的心情

void join(int root1, int root2) //两位经理的 id
{
	int x, y;
	x = unionsearch(root1);//总裁1
	y = unionsearch(root2);//总裁2
	if(x != y) 
		pre[x] = y; //合并
}

参考文章

并查集详解(超级简单有趣~~就学会了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值