这里写自定义目录标题
并查集的概念
在计算机科学中,并查集是一种树形的数据结构,用于处理不交集的合并(union)及查询(find)问题。可用于查询网络中两个节点的状态,这里的网络是一个抽象的概念, 不仅仅指互联网中的网络, 也可以是人际关系的网络、交通网络,路径关系等。
并查集 除了可以用于查询 网络 中两个节点的状态, 还可以用于数学中集合相关的操作, 如求两个集合的并集等。
并查集 对于查询两个节点的 连接状态 非常高效。对于两个节点是否相连,也可以通过求解 查询路径 来解决, 也就是说如果两个点的连接路径都求出来了,自然也就知道两个点是否相连了,但是如果仅仅想知道两个点是否相连,使用 路径问题 来处理效率会低一些,并查集 就是一个很好的选择。(这段是从网络中查找的比较官方的概念)。
并查集的适用情况
并查集是一种算法可以用来判断相互关联(同属一个集合)的元素属于几个集合,也可以用来判断图结构中的两点是否是联通的。
从我的自身经验来看,通俗一点的回答就是判亲戚(如果a和b是亲戚,b和c是亲戚,那么a和c也是亲戚)(是亲戚就意味着祖先是相同的【可能举例不恰当,为了方便理解】,血缘的根是相同的),连村子(如果甲村修了路可以去乙村,乙村又修路去了丙村,那么甲村也可以去到丙村)这样的关系问题;又或者是修电线呀等等,都是基本一样的。
介绍根,父结点与子结点,深度。(图)
图中,a为b,c,d,e,f,G的根,a 又是 b , c 的父结点,b , c 是 a 的子结点,又分别是d, e 与 f 的父结点。
基本函数
1.初始化
//对父结点和深度进行初始化
void init(int parent[],int mark[]) //参数:传入每一个元素的父结点数组,深度数组
{
int i; //利用i遍历
for(i=0; i<maxn; i++)
{
parent[i]=-1; //先初始化各自的第一条根(父结点)为他本身
mark[i]=0; //深度初始化为0
}
}
将每一个初始元素的父结点定义为-1,深度定义为0。
2.找根(找每一个传过来的元素的根)
//找最终根结点
int finds(