floyd.go 848 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. fmt.Println(floyd(adj, length))
  21. }
  22. func floyd(adj [][]int, length [][]int) [][]int {
  23. n := len(adj)
  24. dist := make([][]int, n)
  25. for i := range dist {
  26. dist[i] = make([]int, n)
  27. for j := range dist[i] {
  28. dist[i][j] = math.MaxInt32
  29. }
  30. }
  31. for u := range adj {
  32. for _, v := range adj[u] {
  33. dist[u][v] = length[u][v]
  34. }
  35. }
  36. for k := 0; k < n; k++ {
  37. for i := 0; i < n; i++ {
  38. for j := 0; j < n; j++ {
  39. if alt := dist[i][k] + dist[k][j]; alt < dist[i][j] {
  40. dist[i][j] = alt
  41. }
  42. }
  43. }
  44. }
  45. return dist
  46. }