并查集

并查集是一种非常重要的数据结构。之前听的晕乎乎的,今天自己学了一下,发现很简单

为什么要用并查集?

因为快!

可以迅速找到祖宗,非常好用!

一开始,很简单,所有人都是自己的祖宗。因此

for (int i=1;i<100000;i++)
	ren[i]=i;

接着,每次输入时,有一个寻找祖宗的办法。

int find(int x)
{
	if (x!=ren[x])
	return ren[x]=find(ren[x]);
	else
	return x;
}

自己等于自己,说明这就是老祖宗,否则继续往上走。这里最巧妙的是,走的时候也把每个孙子、重孙、玄孙直接变成儿子,可以一步到位查到祖宗。

当然,还要合并一些值

void unite(int x,int y)
{
	x=find(x);
	y=find(y);
	if (x==y)return;
	ren[x]=y;
}

找到两人的祖宗,如果是同一个,就什么也不做,否则让x的祖宗变成y的祖宗。

查询当然只要find两个值的祖宗就行了

 

 

 

总结:

并查集,实际上就是一堆值,和祖宗之间的映射关系。哪些是一类,就会有一个相同的祖宗。找到这个们就是一类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值