并查集

简介

并查集用于处理不相交集合的合并与查询问题,常见操作有:

  • 查询:查询元素属于哪个集合,可用于判断元素是否在一个集合中

  • 合并:合并两个集合

应用场景:动态连通性的判断,且不需要给出具体路径。

数据结构

初始化

id数组存放的是节点的组号,初始化时将每个节点单独分为一组。

private int[] id;

public DisjoinSet(int size) {
    id = new int[size];
    for(int i = 0; i < size; i++)
        id[i] = i;
}

Quick-Find

由于使用整数表示节点,可以通过数组实现节点到组编号的映射。

Quick-Union

id数组存放的是节点的父节点索引,根节点的父节点是自身,通过这点判断能到达根节点。

Weighted Quick Union

保存两棵树的大小,每次将小的合并到大的树中。

常见例题

冗余连接

684. 冗余连接

在本问题中, 树指的是一个连通且无环的无向图。

输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。

结果图是一个以组成的二维数组。每一个的元素是一对[u, v] ,满足 u < v,表示连接顶点uv无向图的边。

返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v

打砖块

803. 打砖块

有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白。砖块 稳定(不会掉落)的前提是:

  • 一块砖直接连接到网格的顶部,或者

  • 至少有一块相邻(4 个方向之一)砖块 稳定 不会掉落时

给你一个数组 hits ,这是需要依次消除砖块的位置。每当消除 hits[i] = (rowi, coli) 位置上的砖块时,对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这一消除操作而掉落。一旦砖块掉落,它会立即从网格中消失(即,它不会落在其他稳定的砖块上)。

返回一个数组 result ,其中 result[i] 表示第 i 次消除操作对应掉落的砖块数目。

注意,消除可能指向是没有砖块的空白位置,如果发生这种情况,则没有砖块掉落。

思路:并查集是用于合并连通分量,而砖块消失实质上是拆分连通分量,因此这题应当逆向考虑,即先打碎所有砖块,再从后向前添加砖块(合并连通分量),添加后计算会增加多少个节点与根节点相连。

首先给出并查集的定义,size既表示连通分量的大小,也用于合并时的权重判断。

实际使用中将二维数组映射为一维数组,并在最后增加一项作为“房顶节点”,与其相连的节点均不会下落。下面是算法逻辑:

最后更新于