广场舞老太太都看得懂的并查集

1.并查集为什么叫“并查集”这个名字?

因为并查集它的主要用处就是并(合并无交集集合)和查(查找元素或判断是否有该元素),当然路径压缩也得用到它。话说回来,并查集虽然是图论里的东西,但是本身像个树。

2.算法

说到并查集,就不得不提到压缩路径了,它是一个超级简单,但是很牛的算法,算法主要是先定义一个存储任意支点的父亲节点,(根节点的是他本身)遍历任意一个支点时,通过递归,来向上搜索,最后返回根节点,在回溯的途中,直接将自己的长辈节点们全部变成祖先的儿子,于是,(自己的长辈变成了哥哥和弟弟)根节点直接连接大部分以自己为祖先的节点,效率变高。

通常,在代码中,存父亲节点时,通常会用一个f[]数组。

int f[1e1000];

压缩路径(code)

int father[1e100];
int find(int x){
	if(father[x]==x)return x;
	return father[a]=find(father[a]);
}

当然,并查集也可以合并集合。

就是直接将别人的祖先变成自己的祖先。

合并(code)

void merge(int x,int y){
	int p1=find(x);
	int p2=find(y);
	if(p1!=p2) f[p1]=f[p2]
}

简单试试手

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值