bellman-ford.go 883 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package main
  2. import (
  3. "fmt"
  4. "math"
  5. )
  6. func main() {
  7. var n, m, src int
  8. fmt.Scan(&n, &m, &src)
  9. adj := make([][]int, n)
  10. length := make([][]int, n)
  11. for i := range length {
  12. length[i] = make([]int, n)
  13. }
  14. for i := 0; i < m; i++ {
  15. var u, v, l int
  16. fmt.Scan(&u, &v, &l)
  17. adj[u] = append(adj[u], v)
  18. length[u][v] = l
  19. }
  20. dist, prev := bellmanFord(adj, length, src)
  21. fmt.Println(dist)
  22. fmt.Println(prev)
  23. }
  24. func bellmanFord(adj [][]int, length [][]int, src int) ([]int, []int) {
  25. n := len(adj)
  26. dist := make([]int, n)
  27. prev := make([]int, n)
  28. for i := 0; i < n; i++ {
  29. dist[i] = math.MaxInt32
  30. prev[i] = -1
  31. }
  32. dist[src] = 0
  33. for updated := true; updated; updated = false {
  34. for u := range adj {
  35. for _, v := range adj[u] {
  36. if alt := dist[u] + length[u][v]; alt < dist[v] {
  37. dist[v] = alt
  38. prev[v] = u
  39. updated = true
  40. }
  41. }
  42. }
  43. }
  44. return dist, prev
  45. }