一.常见问题:
?并查集必须一次性给出所有数据,而不能流式输入
1.并查集是解决什么问题的?
①判断两个节点是否属于一个集合
②快速将两个节点所在的节点合并
2.并查集的本质是什么?多叉树
3.为什么要将并查集扁平化
判两个节点是否属于同一集合或快速合并集合,都需要找到根节点,太浪费时间。扁平化可以降低时间复杂度
4.单次查询和合并的时间复杂度未O(1)
5.并查集应用:
A.合并:朋友圈/岛问题(L547)、冗余连接(L684)、强盗团伙(A784)
B.并查集解决的是图中的关系问题,在一个图中和某个点有关系的点是该点所在的行和列(A784)
二.并查集模板
1.路径压缩
for(int i=0;i<arr.length;i++)
arr[i]=i;//将所有节点的父节点设为自己
int find(int x)
{
if(p[x]!=x) return p[x]=find(p[x]);
return p[x];
}
2.合并
p[find(x)]=find(y);//x的祖先是赋值为y的祖先
3.判断父节点是否相同
if(p[y]!=p[x]) print("YES");
else print("NO");