并查集-连通性问题
连通性问题
比如随意给你两个点,让你判断它们是否连通?或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。
以下面这组数据输入数据来说明 4 2 1 3 4 3
第一行告诉你,一共有4个点,2条路。下面两行告诉你,1、3之间有条路,4、3之间有条路。那么整幅图就被分成了1-3-4和2两部分。只要再加一条路,把2和其他任意一个点连起来,就都连通了,那么这个这组数据的输出结果就是1(个相互独立的块)。
并查集
并查集由一个整数型的数组和两个函数构成。数组pre[]记录了每个点的前导点是什么,函数find是查找,join是合并。
- 数组下标是当前点的号码,值是前导点的号码,如果值和下标一样代表自己是根。
- 查找是找根用的,直到找到值和下标一样的根位置
- 合并就是在两个根之间修改其中一个根的值为另一个根的下标或者值。
路径压缩算法:最理想的情况就是所有点的前导点都是相同的根,一共就是两级结构。做法就是在查找时找到根之后把自身的值修改成根的下标。