dengxinyi 6 yıl önce
ebeveyn
işleme
f215a306c7
1 değiştirilmiş dosya ile 48 ekleme ve 0 silme
  1. 48 0
      oj/algorithms/graph/bellman-ford.go

+ 48 - 0
oj/algorithms/graph/bellman-ford.go

@@ -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
+}