可以解决什么问题
常用来解决连通性问题
大白话:就是当我吗需要判断两个元素是否在同一个集合里的时候,我们就要想到用并查集;
并查集主要有两个功能:
1、将两个元素添加到一个集合中;
2、判断两个元素在不在同一个集合;
原理
如何将两个元素添加到同一个集合中呢?
先看看有哪些错误想法:
1、放到同一个数组/set/map中,这样就表述两个元素在同一个集合
那问题来了,如果有成百上千个集合,难道要定义这么多个数组吗,肯定不行
2、定义一个二维数组
如果要判断两个元素是否在同一个集合里,或者添加一个元素到某集合,
只能把二维数组都遍历一遍。
这还是一个粗略的想法,如果沿着这个思路去实现代码,非常负责,因为管理集合还需要很多逻辑
正确解法:
3、将三个元素放在同一个集合,就是将三个元素连通在一起
如何连通呢,只要用一个一维数组表示:
father[A]=B,father[B]=C
这样就表述A与B与C连通了(有向连通图)
代码如下:
//将v,u这条边加入并查集
void join(int i,int v){
u=find(u);//寻找u的根
v=find(v);//寻找v的根