并查集详解

本文通过hdu1213题解详细讲解并查集,并以实例展示数据输入如何影响并查集的结构。最终,通过分析并查集数组,得出集合数量的结论。
摘要由CSDN通过智能技术生成

 

以hdu1213为例:题解

第一组数据:

N=5  M=3

1  2

2  3

4  5

数组初始值:

father[1]=1 father[2]=2  father[3]=3  father[4]=4 father[5]=5

第一行数据输入后:

father[1]=2 father[2]=2  father[3]=3  father[4]=4 father[5]=5

此时编号为1和2的人相关联,将faher[1]的值变为2

第二行数据输入后:

father[1]=1  father[2]=3  father[3]=3 father[4]=4  father[5]=5

此时编号为2和3的人相关联,将faher[2]的值变为3

第三行数据输入后同上,最后数组的值变为

father[1]=1  father[2]=3  father[3]=3 father[4]=5  father[5]=5

 

由题目中所给数据我们可以手动将5个人分成两组

第一组:1  2  3

第二组:4  5

 

再联系数组中的结果我们可以发现,第一组数组中的数值只有一个人的数组序号和其对应的数组的值相等,第二组亦然。

 

第二组数据:

N=5  M=1

2 5

数据输入后数组的结果

father[1]=1  father[2]=5  father[3]=3 father[4]=4  father[5]=5

第一组:1

第二组:2  5

第三组:3

第四组:4

结果同第一组数据

 

结论:由以上例子得出,数组中father[i]=i的i的数量即为集合数

 

Union(int x,int y)//将两个序号关联
{
	x=Find(x);
	y=Find(y);
	father[x]=y;
}
Find(int x)//找到该集合中father[i]=i形式的元素进行关联,目的是维持每个集合中只                        
          //有一个元素在数组中的形式是father[i]=i
{
	if(x==father[x]) return x;
	return Find(father[x]);                       
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值