并查集 ——数组实现


并查集

作用:

        1. 用来合并集合元素,并确定结合数量,查寻元素属于哪个集合。

        2. 在图结构里(图里的点便是元素),确定两点是否处于联通状态,应用举例:

          eg:    集合个数     Hdu 畅通工程

                     最小生成树  Hdu 还是畅通工程

#include <iostream>
#include <cstdio>
/*
	function: 1.合并
       		  2.查找

*/
#define MAXN 1010 
int pre[MAXN];

 int find(int& index)
{
	return pre[index] = pre[index] == index ? pre[index] : find(pre[index]);
}  

void Union(int& a,int& b)
{
	pre[find(a)] = find(b);
}

void init(int& n)
{
	for(int j = 0; j != n; j++)
		pre[j] = j;
}

int main()
{
	/*遍历一遍数组,发现数组里储存的元素是自己,则这个节点为其中一个元素的根
	比如 Hdu_1232_畅通工程,求得就是根得个数减去 1 
	*/ 
}

关于find函数

 int find(int& index)
{
	return pre[index] = pre[index] == -1 ? pre[index] : find(pre[index]);
}  
        prr[index] == -1 ? pre[index] : find(pre[index]); 
        如果某个数组元素里存的是 自身的下标,说明这个元素是一个集合的根。

        否则,便递归寻找下去。

        。。。

        知道找到了根, 把根的编号 一层层复制回集合中的其余元素,这是一种减支。

       eg:

        pre   0 1 2  3 4 5 6

                1-2-3-4-4-3-3

             给 find(a) 传进去一个参数0,从下标0开始找, pre[0]中存储的是1,表示pre[0]的父节点是1,

                。。。

             找到 pre[4]等于4,然后递归返回

             把 4   赋值给  pre[4]

             把 pre[4] --> pre[3]

             把 pre[3] --> pre[2]

             把 pre[2] --> pre[1]

             把 pre[1] --> pre[0]

             0 1 2 3  4 5 6

             4  4 4 4 4 4 4

    本鶸正在进步中,欢迎大家踊跃评论批评并给出意见。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值