dijkstra.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 pair struct {
  26. k int
  27. w int
  28. }
  29. type minHeap []pair
  30. func (h minHeap) Len() int { return len(h) }
  31. func (h minHeap) Less(i, j int) bool { return h[i].w < h[j].w }
  32. func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
  33. func (h *minHeap) Push(x interface{}) {
  34. *h = append(*h, x.(pair))
  35. }
  36. func (h *minHeap) Pop() interface{} {
  37. l := len(*h)
  38. x := (*h)[l-1]
  39. *h = (*h)[:l-1]
  40. return x
  41. }
  42. func dijkstra(adj [][]int, length [][]int, src int) (dist []int, prev []int) {
  43. n := len(adj)
  44. dist = make([]int, n)
  45. prev = make([]int, n)
  46. used := make([]bool, n)
  47. for i := 0; i < n; i++ {
  48. dist[i] = math.MaxInt32
  49. prev[i] = -1
  50. }
  51. dist[src] = 0
  52. var mh minHeap
  53. heap.Push(&mh, pair{src, 0})
  54. for mh.Len() != 0 {
  55. u := heap.Pop(&mh).(pair)
  56. if used[u.k] {
  57. continue
  58. }
  59. used[u.k] = true
  60. for _, v := range adj[u.k] {
  61. alt := u.w + length[u.k][v]
  62. if alt < dist[v] {
  63. dist[v] = alt
  64. prev[v] = u.k
  65. heap.Push(&mh, pair{v, alt})
  66. }
  67. }
  68. }
  69. return
  70. }