迪杰斯特拉算法的核心在于,我们标记的“已访问”的节点,是已经通过多次探索权值最小项来确定好了到该节点的加权路径已经是确定的最小值了,所以可以通过本次“已访问”的节点来去继续访问其他节点而不用去担心产生因为已访问的节点值改变而产生其他节点的值变化,因为以访问的节点的值已经固定最小了。
代码实现:
package main
import "fmt"
const MAXVEX int = 9
const MAXWEIGHT int = 1000
func NewGraph() [MAXVEX][MAXVEX]int {
var graph [MAXVEX][MAXVEX]int
var v0 = [MAXVEX]int{0, 1, 5, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
var v1 = [MAXVEX]int{1, 0, 3, 7, 5, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
var v2 = [MAXVEX]int{5, 3, 0, MAXWEIGHT, 1, 7, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
var v3 = [MAXVEX]int{MAXWEIGHT, 7, MAXWEIGHT, 0, 2, MAXWEIGHT, 3, MAXWEIGHT, MAXWEIGHT}
var v4 = [MAXVEX]int{MAXWEIGHT, 5, 1, 2, 0, 3, 6, 9, MAXWEIGHT}
var v5 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, 7, MAXWEIGHT, 3, 0, MAXWEIGHT, 5, MAXWEIGHT}
var v6 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, 3, 6, MAXWEIGHT, 0, 2, 7}
var v7 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, 9, 5, 2, 0, 4}
var v8 = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, 7, 4, 0}
graph[0] = v0
graph[1] = v1
graph[2] = v2
graph[3] = v3
graph[4] = v4
graph[5] = v5
graph[6] = v6
graph[7] = v7
graph[8] = v8
return graph
}
func Dijkstra(i int, j int, graph [MAXVEX][MAXVEX]int) int {
var shortTablePath = [MAXVEX]int{MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT, MAXWEIGHT}
i -= 1
j -= 1
var TablePathMin int //未遍历的最小节点的值
var Vx int //未遍历的最小节点的下标
var isgetPath [MAXVEX]bool //记录节点是否已访问
var MinPath [MAXVEX]int //此点的上一节点
var lastPath int //上一节点
for v := 0; v < MAXVEX; v++ {
shortTablePath[v] = graph[i][v]
}
shortTablePath[i] = 0
isgetPath[i] = true
lastPath = i
for v := 1; v < MAXVEX; v++ {
TablePathMin = MAXWEIGHT
for w := 0; w < MAXVEX; w++ { //找出未访问的最小节点
if !isgetPath[w] && shortTablePath[w] < TablePathMin {
Vx = w
TablePathMin = shortTablePath[w]
}
}
isgetPath[Vx] = true
MinPath[Vx] = lastPath
if Vx == j {
Patht := Vx
Path := []int{}
for {
Path = append(Path, MinPath[Patht])
Patht = MinPath[Patht]
if Patht == i {
break
}
}
fmt.Println("最小路径为")
for t := len(Path) - 1; t >= 0; t-- {
fmt.Println(Path[t] + 1)
}
fmt.Println("最小值为 ", shortTablePath[Vx])
return shortTablePath[Vx]
}
for j := 0; j < MAXVEX; j++ {
if !isgetPath[j] && TablePathMin+graph[Vx][j] < shortTablePath[j] {
shortTablePath[j] = TablePathMin + graph[Vx][j]
}
}
lastPath = Vx
}
return MAXWEIGHT
}
func main() {
graph := NewGraph()
i := Dijkstra(1, 5, graph)
fmt.Println(i)
}