commit
9e7a1904a5
@ -0,0 +1,57 @@
|
|||||||
|
// shortest distances between every pair of vertices using floyd-warshall algorithm
|
||||||
|
// https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
|
||||||
|
// http://www.golangprograms.com/golang-program-for-implementation-of-floyd-warshall-algorithm.html
|
||||||
|
package graph
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type graph struct {
|
||||||
|
to int
|
||||||
|
wt float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func floydWarshall(g [][]graph) [][]float64 {
|
||||||
|
dist := make([][]float64, len(g))
|
||||||
|
for i := range dist {
|
||||||
|
di := make([]float64, len(g))
|
||||||
|
for j := range di {
|
||||||
|
di[j] = math.Inf(1)
|
||||||
|
}
|
||||||
|
di[i] = 0
|
||||||
|
dist[i] = di
|
||||||
|
}
|
||||||
|
for u, graphs := range g {
|
||||||
|
for _, v := range graphs {
|
||||||
|
dist[u][v.to] = v.wt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for k, dk := range dist {
|
||||||
|
for _, di := range dist {
|
||||||
|
for j, dij := range di {
|
||||||
|
if d := di[k] + dk[j]; dij > d {
|
||||||
|
di[j] = d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dist
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
gra := [][]graph{
|
||||||
|
1: {{2, 3}, {3, 8}, {5, -4}},
|
||||||
|
2: {{4, 1}, {5, 7}},
|
||||||
|
3: {{2, 4}},
|
||||||
|
4: {{1, 2}, {3, -5}},
|
||||||
|
5: {{4, 6}},
|
||||||
|
}
|
||||||
|
|
||||||
|
dist := floydWarshall(gra)
|
||||||
|
//dist[][] will be the output matrix that will have the shortest distances between every pair of vertices
|
||||||
|
for _, d := range dist {
|
||||||
|
fmt.Printf("%4g\n", d)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue