关于并查集

大白话解析:

  • 如果两个元素分属于两个不同的集合,则将包含两个元素的所有集合都合并;
  • 如果两个集合属于同一集合,则两个元素是连通的,反之,不连通。
    例子: 现有时十台电脑,分别为1,2,3,4,5,6,7,8,9,10。1与2连接,2与3,连接,3与5连接,5和9连接,问1与5是否连接?很明显1与5属于同一集合,连接。
用树来表示集合,树的每个结点代表一个集合元素。

数组来存储

  • 查找操作:给定一个x,看x属于哪个集合

int Find(int s[],int x)
{
	int i;
	for(i=0;i<MAZSIZE&&s[i].data!=x;i++)
		;
	if(i>=MAZSIZE)
		return -1;
	for(;s[i].parent>=0;i=s[i].parent)
		return i;//递归往上找x所属集合;
}

  • 并操作

    分别找到x和y两个元素所在集合树的根结点;
    如果它们不同根,则将其中一个根结点的父结点指针设置成另一个根结点的数组下标。
    void Union(int s[],int x,int y)
    {
    	int Root1,Root2;
    	Root1=Find(s,x);
    	Root2=Find(s,y);
    	if(Root1!=Root2) s[Root2].parent=Root1;//1是2的父结点。
    }

    尽量将小的集合并到大的集合中去。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值