123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- package main
- import (
- "fmt"
- "math"
- )
- func main() {
- var n, m, src int
- fmt.Scan(&n, &m, &src)
- adj := make([][]int, n)
- length := make([][]int, n)
- for i := range length {
- length[i] = make([]int, n)
- }
- for i := 0; i < m; i++ {
- var u, v, l int
- fmt.Scan(&u, &v, &l)
- adj[u] = append(adj[u], v)
- length[u][v] = l
- }
- dist, prev := bellmanFord(adj, length, src)
- fmt.Println(dist)
- fmt.Println(prev)
- }
- func bellmanFord(adj [][]int, length [][]int, src int) ([]int, []int) {
- n := len(adj)
- dist := make([]int, n)
- prev := make([]int, n)
- for i := 0; i < n; i++ {
- dist[i] = math.MaxInt32
- prev[i] = -1
- }
- dist[src] = 0
- for updated := true; updated; updated = false {
- for u := range adj {
- for _, v := range adj[u] {
- if alt := dist[u] + length[u][v]; alt < dist[v] {
- dist[v] = alt
- prev[v] = u
- updated = true
- }
- }
- }
- }
- return dist, prev
- }
|