并查集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| class UnionFind { private int[] parent; UnionFind(int size) { parent = new int[size]; for (int i = 0; i < size; i++) { parent[i] = i; } } public void join(int a, int b) { int aRoot = find(a); int bRoot = find(b); if (aRoot == bRoot) { return; } parent[aRoot] = bRoot; } public int find(int a) { if (parent[a] == a) { return a } parent[a] = find(parent[a]); return parent[a]; } public boolean isSame(int a, int b) { int aRoot = find(a); int bRoot = find(b); return aRoot == bRoot; } }
|
例题
leetcode 684 冗余连接
基本的并查集
leetcode 685 冗余连接2
额外记录一个directParent,如果有冲突的边(directParent有多个节点),不加入并查集中,记录冲突边[u,v],如果没有冲突的边,更新directParent,如果有环(并查集的根相同),记录成环的边,没有成环的边就更新并查集。
遍历完所有的边后判断如果没有冲突的边,就直接返回成环的边,如果有冲突的边[u,v],先判断如果没有成环的边就直接返回冲突边,有成环的边,说明附加的边不会是[u,v]因为这条边并没有加到并查集中,返回[directParent[v], v]
leetcode 399 除法求值
并查集的过程中额外记录一个权重,并且在路径压缩过程中更新权重值