import (
"testing"
"strconv"
"fmt"
)
// V - S = T
type Dijkstra struct {
Visit bool // 表示是否访问
Val int // 表示距离
Path string // 路径的显示
}
const (
INT_MAX = 1<<32 - 1
)
func getShortPathByDijkstra(begin int, vertex [][]int) []Dijkstra {
if 0 == len(vertex) || 0 == len(vertex[0]) || len(vertex) != len(vertex[0]) {
return []Dijkstra{}
}
d := make([]Dijkstra, len(vertex))
for i := 0; i < len(vertex); i++ {
d[i].Visit = false
d[i].Val = vertex[begin-1][i]
d[i].Path = "V" + strconv.Itoa(begin) + " -> V" + strconv.Itoa(i+1)
}
d[begin-1].Visit = true
d[begin-1].Val = 0
count := 1
for count < len(vertex) { // 从源点到目的点依次加入最短路径节点进去
min := INT_MAX
temp := 0
for i := 0; i < len(vertex); i++ { // 找源点到集合T中最短路径的点加入到S中
if !d[i].Visit && d[i].Val < min {
min = d[i].Val
temp = i
}
}
d[temp].Visit = true
for i := 0; i < len(vertex); i++ { // 进行松弛,即更新源点到各节点的最短路径
if !d[i].Visit && vertex[temp][i] != INT_MAX && d[temp].Val + vertex[temp][i] < d[i].Val {
d[i].Val = d[temp].Val + vertex[temp][i]
d[i].Path = d[temp].Path + " -> V" + strconv.Itoa(i+1)
}
}
count ++
}
return d
}
func TestDij(t *testing.T) {
var vertex [][]int
for i := 0; i < 6; i++ {
tmp := make([]int, 6)
vertex = append(vertex, tmp)
}
for i := 0; i < 6; i++ {
for j:=0;j <6; j++ {
vertex[i][j] = INT_MAX
}
}
vertex[0][2] = 10
vertex[0][4] = 30
vertex[0][5] = 100
vertex[1][2] = 5
vertex[2][3] = 50
vertex[3][5] = 10
vertex[4][5] = 60
vertex[4][3] = 20
d := getShortPathByDijkstra(1, vertex)
fmt.Println(d[5])
}