求圖中兩點最短路徑(dijkstra) go實現
阿新 • • 發佈:2018-11-05
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]) }