310.minimum-height-trees.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. func findMinHeightTreesBFS(n int, edges [][]int) (res []int) { // BFS, start from leaf
  2. if n <= 2 {
  3. for i := 0; i < n; i++ {
  4. res = append(res, i)
  5. }
  6. return
  7. }
  8. adj := make([][]int, n)
  9. inDegree := make(map[int]int)
  10. for i := range edges {
  11. a, b := edges[i][0], edges[i][1]
  12. adj[a] = append(adj[a], b)
  13. adj[b] = append(adj[b], a)
  14. inDegree[a]++
  15. inDegree[b]++
  16. }
  17. for 2 < len(inDegree) {
  18. li := make([]int, 0)
  19. for k, v := range inDegree {
  20. if v == 1 {
  21. li = append(li, k)
  22. }
  23. }
  24. for _, i := range li {
  25. for _, j := range adj[i] {
  26. if v, ok := inDegree[j]; ok {
  27. inDegree[j] = v - 1
  28. }
  29. }
  30. delete(inDegree, i)
  31. }
  32. }
  33. for k, _ := range inDegree {
  34. res = append(res, k)
  35. }
  36. return
  37. }
  38. type pair struct {
  39. _1 int
  40. _2 int
  41. }
  42. func findMinHeightTrees(n int, edges [][]int) (res []int) {
  43. adj := make([][]int, n)
  44. for i := range edges {
  45. a, b := edges[i][0], edges[i][1]
  46. adj[a] = append(adj[a], b)
  47. adj[b] = append(adj[b], a)
  48. }
  49. minDepth := 1<<32 - 1
  50. color := make([]int, n)
  51. m := make(map[pair]int)
  52. for i := 0; i < n; i++ {
  53. maxDepth := getDepth(adj, color, i, &m)
  54. if maxDepth < minDepth {
  55. minDepth = maxDepth
  56. res = []int{i}
  57. } else if maxDepth == minDepth {
  58. res = append(res, i)
  59. }
  60. }
  61. return
  62. }
  63. func getDepth(adj [][]int, color []int, id int, m *map[pair]int) (depth int) {
  64. if len(adj[id]) == 1 && color[adj[id][0]] == 1 {
  65. return
  66. }
  67. color[id] = 1
  68. for _, i := range adj[id] {
  69. if color[i] != 0 {
  70. continue
  71. }
  72. if d, ok := (*m)[pair{id, i}]; ok {
  73. depth = maxInt(depth, d)
  74. continue
  75. }
  76. d := getDepth(adj, color, i, m)
  77. (*m)[pair{id, i}] = d
  78. depth = maxInt(depth, d)
  79. }
  80. color[id] = 0
  81. return depth + 1
  82. }
  83. func maxInt(x, y int) int {
  84. if x < y {
  85. return y
  86. }
  87. return x
  88. }