-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path4.go
61 lines (56 loc) · 1.28 KB
/
4.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
package weekly404
import "github.com/emirpasic/gods/v2/queues/linkedlistqueue"
func minimumDiameterAfterMerge_WA(edges1 [][]int, edges2 [][]int) int {
n := len(edges1) + 1
m := len(edges2) + 1
return 1 +
findMinHeightTrees(n, edges1) +
findMinHeightTrees(m, edges2)
}
func findMinHeightTrees(n int, edges [][]int) int {
if n <= 2 {
return n - 1
}
neighbors := buildAdj(n, edges)
leaves := linkedlistqueue.New[int]()
for i := 0; i < n; i++ {
if len(neighbors[i]) == 1 {
leaves.Enqueue(i)
}
}
remainNode := n
height := 0
for remainNode > 2 {
newLeaves := linkedlistqueue.New[int]()
remainNode -= leaves.Size()
for leaves.Size() > 0 {
left, _ := leaves.Dequeue()
for k := range neighbors[left] {
delete(neighbors[k], left)
if len(neighbors[k]) == 1 {
newLeaves.Enqueue(k)
}
}
}
leaves = newLeaves
height++
}
if remainNode == 2 {
height++
}
return height
}
func buildAdj(n int, edges [][]int) []map[int]struct{} {
neighbors := make([]map[int]struct{}, n)
for _, e := range edges {
if neighbors[e[0]] == nil {
neighbors[e[0]] = make(map[int]struct{})
}
neighbors[e[0]][e[1]] = struct{}{}
if neighbors[e[1]] == nil {
neighbors[e[1]] = make(map[int]struct{})
}
neighbors[e[1]][e[0]] = struct{}{}
}
return neighbors
}