-
-
Notifications
You must be signed in to change notification settings - Fork 8.8k
/
Copy pathSolution.go
47 lines (45 loc) · 890 Bytes
/
Solution.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
func numberOfGoodPaths(vals []int, edges [][]int) int {
n := len(vals)
p := make([]int, n)
size := map[int]map[int]int{}
type pair struct{ v, i int }
arr := make([]pair, n)
for i, v := range vals {
p[i] = i
if size[i] == nil {
size[i] = map[int]int{}
}
size[i][v] = 1
arr[i] = pair{v, i}
}
var find func(x int) int
find = func(x int) int {
if p[x] != x {
p[x] = find(p[x])
}
return p[x]
}
sort.Slice(arr, func(i, j int) bool { return arr[i].v < arr[j].v })
g := make([][]int, n)
for _, e := range edges {
a, b := e[0], e[1]
g[a] = append(g[a], b)
g[b] = append(g[b], a)
}
ans := n
for _, e := range arr {
v, a := e.v, e.i
for _, b := range g[a] {
if vals[b] > v {
continue
}
pa, pb := find(a), find(b)
if pa != pb {
ans += size[pb][v] * size[pa][v]
p[pa] = pb
size[pb][v] += size[pa][v]
}
}
}
return ans
}