forked from shellfly/algo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuf.go
93 lines (82 loc) · 1.58 KB
/
uf.go
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package algs4
// UF ...
type UF struct {
id []int
n int
size map[int]int
Count int
}
// NewUF initialize and return a UF
func NewUF(n int) *UF {
uf := UF{n: n, Count: n}
uf.id = make([]int, n)
uf.size = map[int]int{}
for i := 0; i < n; i++ {
uf.id[i] = i
uf.size[i] = 1
}
return &uf
}
// Connected returns if p and q is connected
func (uf *UF) Connected(p, q int) bool {
return uf.Find(p) == uf.Find(q)
}
// Quick Find
// Find return the id of point p
// func (uf *UF) Find(p int) int {
// return uf.id[p]
// }
// // Union unions p and q
// func (uf *UF) Union(p, q int) {
// pID := uf.Find(p)
// qID := uf.Find(q)
// if pID == qID {
// return
// }
// for index, value := range uf.id {
// if value == pID {
// uf.id[index] = qID
// }
// }
// uf.Count--
// }
// Quick Union
// Find return the id of point p
// func (uf *UF) Find(p int) int {
// for ;p!=uf.id[p];p=uf.id[p]{}
// return p
// }
// // Union unions p and q
// func (uf *UF) Union(p, q int) {
// pRoot := uf.Find(p)
// qRoot := uf.Find(q)
// if pRoot == qRoot {
// return
// }
// uf.id[pRoot] = qRoot
// uf.Count--
// }
// Weighted Quick Union with path compression
// Find ...
func (uf *UF) Find(p int) int {
for ; p != uf.id[p]; p = uf.id[p] {
uf.id[p] = uf.id[uf.id[p]] // path compression by halving
}
return p
}
// Union unions p and q
func (uf *UF) Union(p, q int) {
pRoot := uf.Find(p)
qRoot := uf.Find(q)
if pRoot == qRoot {
return
}
if uf.size[pRoot] > uf.size[qRoot] {
uf.id[qRoot] = pRoot
uf.size[pRoot]++
} else {
uf.id[pRoot] = qRoot
uf.size[qRoot]++
}
uf.Count--
}