并查集一般用于无向图中,其作用一般为两个:
- 1 查看两个节点之间是否连通
- 2 查看某个无向图是否有环
并查集的构建分为3个部分:
- 1 init:为每一个节点初始化一个祖先,其默认值为自身。
- 2 find:通过递归查找节点i的祖先节点,该过程通过压缩路径减少多层递归。
- 3 join:将两个节点进行连通。
并查集检测两个节点是否连通的步骤(构建好无向图之后,再判断):
- 1 init初始化无向图全部节点。
- 2 使用join函数将无向图的边进行连通。
- 3 使用find函数查看该两节点是否连通。
并查集检测无向图是否有环(构建过程中两条边的公共祖先节点相同则存在环)的步骤(构建无向图过程中,进行判断):
- 1 init初始化无向图全部节点。
- 2 在构建过程中使用使用find函数查看是否有公共祖节点,是则有环,如果无环则join函数将无向图的边进行连通。
vector path; void init(int n) { for(int i=0; i<n; i++) path.push_back(i); } int find(int i) { if (path[i] == i) return i; else {
// 不使用路径压缩,即为: return find(path[i]) path[i] = find(path[i]); return path[i]; } } void join(int i, int j) { int path_i = find(i); int path_j = find(j); path[path_i] = path_j; }