今天做题时遇到了一种叫做并查集的方法,特此记录下笔记。
并查集可以动态地连通两个点,并且可以非常快速地判断两个点是否连通。假设存在 n 个节点,我们先将所有节点的父亲标为自己;每次要连接节点 i 和 j 时,我们可以将 i 的父亲标为 j;每次要查询两个节点是否相连时,我们可以查找 i 和 j 的祖先是否最终为同一个人。
代码实现:
int find(int n, int[] p){
int num = n;
while(p[num] != num)
num = p[num];
return num;
}
void union( int m, int n, int[] p) {
if(find(m,p) != find(n,p))
p[find(m,p)] = find(m,p);
}