码迷,mamicode.com
首页 > 其他好文 > 详细

并查集小结

时间:2020-06-11 19:33:15      阅读:42      评论:0      收藏:0      [点我收藏+]

标签:tps   lan   直接   怎么   line   总结   lang   合并   实现   

并查集就是一个可以连通一块东西的工具。


基础:

这么理解吧,有一堆亲戚,每次给你两个人,告诉你他们是亲戚,最后任意给你两个人,问他们是不是亲戚。

这个时候,并查集就大显神通了。我们可以每次输入两个数,如果这两个数不在一块,把这两个数连接起来,到了最后,不就是变成了一棵树了吗?最后查询时,每次看他们是不是在一棵树上就行,也就可以查询他们的根是不是一样的。

并查集实现的就是大概这样一个功能,下面给出代码:

查找:

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

合并:

void un(int x , int y){
	int xx = find(x) , yy = find(y);
	fa[xx] = yy;
}

\(fa[i]\)就是指某一个节点的父亲,对其初始化时肯定是\(fa[i]=i\),指向自己。


优化

可是,有的时候,这条链会被拉的很长,像这样:
很长的链~

这样往上搜索时,会很耗费时间,这个时候怎么办呢,优化:

路径压缩:
因为我们只用找到他们的根节点就可以看他们是不是一起的了,为何不让他们都直接指向根节点呢?像这样:
很短的链~

这样过后,查找时间就变短了,合并的代码肯定就不变了,下面给出查找的代码:

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

总结:其实优化还有一种方法,叫按秩合并,但是优化作用没路径压缩大,也不太好写,只有路径压缩就已经够了嗐就是不会而已

亿道并查集联系题:奶酪

并查集小结

标签:tps   lan   直接   怎么   line   总结   lang   合并   实现   

原文地址:https://www.cnblogs.com/bzzs/p/13095399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!