算法图论学习-并查集

97 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

什么是并查集

  • 来自百度回答

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示

  • 个人理解

a是b的朋友,c是b的朋友那么a也是c的朋友(朋友的朋友也是我的朋友)这样对于一个连通块中他们肯定都有一个共同的朋友我们将这个朋友x作为这这个连通块的标志,如果你是这个连通块的元素那么你的朋友中肯定有x。其实一个连通块是以树形结构储存的它的根节点就是我们的共同父亲。

Code

//并查集的模板
int find(int x) {return f[x] == x ? f[x] : f[x] = find(f[x]);}
//初始化
for(int i = 1; i <= n; i++) f[i] = i; // 一个点及是一个连通块