|
@@ -0,0 +1,48 @@
|
|
|
+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
|
|
|
+}
|