banner
NEWS LETTER

unionFind

Scroll down

并查集

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 除法求值

并查集的过程中额外记录一个权重,并且在路径压缩过程中更新权重值