Skip to content

Commit 9bad1e0

Browse files
authored
Add Union Find (fixes TheAlgorithms#2692) (TheAlgorithms#2693)
1 parent 87e10d6 commit 9bad1e0

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

Searches/UnionFind.java

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package Searches;
2+
3+
import java.util.*;
4+
5+
public class UnionFind {
6+
private int[] p;
7+
private int[] r;
8+
9+
public UnionFind(int n) {
10+
p = new int[n];
11+
r = new int[n];
12+
13+
for (int i = 0; i < n; i++) {
14+
p[i] = i;
15+
}
16+
}
17+
18+
public int find(int i) {
19+
int parent = p[i];
20+
21+
if (i == parent) return i;
22+
23+
return p[i] = find(parent);
24+
}
25+
26+
public void union(int x, int y) {
27+
int r0 = find(x);
28+
int r1 = find(y);
29+
30+
if (r1 == r0) return;
31+
32+
if (r[r0] > r[r1]) {
33+
p[r1] = r0;
34+
} else if (r[r1] > r[r0]) {
35+
p[r0] = r1;
36+
} else {
37+
p[r1] = r0;
38+
r[r0]++;
39+
}
40+
}
41+
42+
public int count() {
43+
List parents = new ArrayList();
44+
for(int i = 0; i < p.length; i++) {
45+
if(!parents.contains(find(i))) {
46+
parents.add(find(i));
47+
}
48+
}
49+
return parents.size();
50+
}
51+
52+
public String toString() {
53+
return "p " + Arrays.toString(p) + " r " + Arrays.toString(r) + "\n";
54+
}
55+
56+
// Tests
57+
public static void main(String[] args) {
58+
UnionFind uf = new UnionFind(5);
59+
System.out.println("init /w 5 (should print 'p [0, 1, 2, 3, 4] r [0, 0, 0, 0, 0]'):");
60+
System.out.println(uf);
61+
62+
uf.union(1,2);
63+
System.out.println("union 1 2 (should print 'p [0, 1, 1, 3, 4] r [0, 1, 0, 0, 0]'):");
64+
System.out.println(uf);
65+
66+
uf.union(3,4);
67+
System.out.println("union 3 4 (should print 'p [0, 1, 1, 3, 3] r [0, 1, 0, 1, 0]'):");
68+
System.out.println(uf);
69+
70+
uf.find(4);
71+
System.out.println("find 4 (should print 'p [0, 1, 1, 3, 3] r [0, 1, 0, 1, 0]'):");
72+
System.out.println(uf);
73+
74+
System.out.println("count (should print '3'):");
75+
System.out.println(uf.count());
76+
}
77+
}

0 commit comments

Comments
 (0)