并查集
简介
并查集用于处理不相交集合的合并与查询问题,常见操作有:
查询:查询元素属于哪个集合,可用于判断元素是否在一个集合中
合并:合并两个集合
应用场景:动态连通性的判断,且不需要给出具体路径。
数据结构
初始化
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
保存两棵树的大小,每次将小的合并到大的树中。
常见例题
冗余连接
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以
边组成的二维数组。每一个边的元素是一对[u, v],满足u < v,表示连接顶点u和v的无向图的边。返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边
[u, v]应满足相同的格式u < v。
打砖块
有一个
m x n的二元网格,其中1表示砖块,0表示空白。砖块 稳定(不会掉落)的前提是:
一块砖直接连接到网格的顶部,或者
至少有一块相邻(4 个方向之一)砖块 稳定 不会掉落时
给你一个数组
hits,这是需要依次消除砖块的位置。每当消除hits[i] = (rowi, coli)位置上的砖块时,对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这一消除操作而掉落。一旦砖块掉落,它会立即从网格中消失(即,它不会落在其他稳定的砖块上)。返回一个数组
result,其中result[i]表示第i次消除操作对应掉落的砖块数目。注意,消除可能指向是没有砖块的空白位置,如果发生这种情况,则没有砖块掉落。
思路:并查集是用于合并连通分量,而砖块消失实质上是拆分连通分量,因此这题应当逆向考虑,即先打碎所有砖块,再从后向前添加砖块(合并连通分量),添加后计算会增加多少个节点与根节点相连。
首先给出并查集的定义,size既表示连通分量的大小,也用于合并时的权重判断。
实际使用中将二维数组映射为一维数组,并在最后增加一项作为“房顶节点”,与其相连的节点均不会下落。下面是算法逻辑:
最后更新于