dijkstra.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package main
  2. import (
  3. "container/heap"
  4. "fmt"
  5. "math"
  6. )
  7. func main() {
  8. var n, m, src int
  9. fmt.Scan(&n, &m, &src)
  10. adj := make([][]int, n)
  11. length := make([][]int, n)
  12. for i := range length {
  13. length[i] = make([]int, n)
  14. }
  15. for i := 0; i < m; i++ {
  16. var u, v, l int
  17. fmt.Scan(&u, &v, &l)
  18. adj[u] = append(adj[u], v)
  19. length[u][v] = l
  20. }
  21. dist, prev := dijkstra(adj, length, src)
  22. fmt.Println(dist)
  23. fmt.Println(prev)
  24. }
  25. type minHeap [][2]int
  26. func (h minHeap) Len() int { return len(h) }
  27. func (h minHeap) Less(i, j int) bool { return h[i][0] < h[j][0] }
  28. func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
  29. func (h *minHeap) Push(x interface{}) {
  30. *h = append(*h, x.([2]int))
  31. }
  32. func (h *minHeap) Pop() interface{} {
  33. l := len(*h)
  34. x := (*h)[l-1]
  35. *h = (*h)[:l-1]
  36. return x
  37. }
  38. func dijkstra(adj [][]int, length [][]int, src int) (dist []int, prev []int) {
  39. n := len(adj)
  40. dist = make([]int, n)
  41. prev = make([]int, n)
  42. for i := 0; i < n; i++ {
  43. dist[i] = math.MaxInt32
  44. prev[i] = -1
  45. }
  46. dist[src] = 0
  47. var mh minHeap
  48. heap.Push(&mh, [2]int{0, src})
  49. for mh.Len() != 0 {
  50. u := heap.Pop(&mh).([2]int)
  51. if dist[u[1]] < u[0] {
  52. continue
  53. }
  54. for _, v := range adj[u[1]] {
  55. alt := u[0] + length[u[1]][v]
  56. if alt < dist[v] {
  57. dist[v] = alt
  58. prev[v] = u[1]
  59. heap.Push(&mh, [2]int{alt, v})
  60. }
  61. }
  62. }
  63. return
  64. }