1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- func findMinHeightTreesBFS(n int, edges [][]int) (res []int) { // BFS, start from leaf
- if n <= 2 {
- for i := 0; i < n; i++ {
- res = append(res, i)
- }
- return
- }
- adj := make([][]int, n)
- inDegree := make(map[int]int)
- for i := range edges {
- a, b := edges[i][0], edges[i][1]
- adj[a] = append(adj[a], b)
- adj[b] = append(adj[b], a)
- inDegree[a]++
- inDegree[b]++
- }
- for 2 < len(inDegree) {
- li := make([]int, 0)
- for k, v := range inDegree {
- if v == 1 {
- li = append(li, k)
- }
- }
- for _, i := range li {
- for _, j := range adj[i] {
- if v, ok := inDegree[j]; ok {
- inDegree[j] = v - 1
- }
- }
- delete(inDegree, i)
- }
- }
- for k, _ := range inDegree {
- res = append(res, k)
- }
- return
- }
- type pair struct {
- _1 int
- _2 int
- }
- func findMinHeightTrees(n int, edges [][]int) (res []int) {
- adj := make([][]int, n)
- for i := range edges {
- a, b := edges[i][0], edges[i][1]
- adj[a] = append(adj[a], b)
- adj[b] = append(adj[b], a)
- }
- minDepth := 1<<32 - 1
- color := make([]int, n)
- m := make(map[pair]int)
- for i := 0; i < n; i++ {
- maxDepth := getDepth(adj, color, i, &m)
- if maxDepth < minDepth {
- minDepth = maxDepth
- res = []int{i}
- } else if maxDepth == minDepth {
- res = append(res, i)
- }
- }
- return
- }
- func getDepth(adj [][]int, color []int, id int, m *map[pair]int) (depth int) {
- if len(adj[id]) == 1 && color[adj[id][0]] == 1 {
- return
- }
- color[id] = 1
- for _, i := range adj[id] {
- if color[i] != 0 {
- continue
- }
- if d, ok := (*m)[pair{id, i}]; ok {
- depth = maxInt(depth, d)
- continue
- }
- d := getDepth(adj, color, i, m)
- (*m)[pair{id, i}] = d
- depth = maxInt(depth, d)
- }
- color[id] = 0
- return depth + 1
- }
- func maxInt(x, y int) int {
- if x < y {
- return y
- }
- return x
- }
|