1.实现过程详解
Dijkstra 算法是一种用于计算无向图的最短路径的算法。它是基于贪心策略的,每次选择当前距离起始节点最近的未访问节点进行访问,并更新其相邻节点的距离值,以得到最短路径。
在实现 Dijkstra 算法时,需要按照以下步骤进行:
- 初始化 visited 和 distance 数组
首先,需要定义两个数组 visited 和 distance。visited 数组用于记录节点是否被访问过,distance 数组用于记录起始节点到各个节点的最短距离。
具体实现中,需要遍历整个节点集合,将 visited 数组初始化为 false,distance 数组初始化为一个足够大的值(例如 math.MaxInt32)。
- 起始节点到自身的距离为 0
起始节点到自身的距离为 0,需要将 distance 数组中起始节点的距离值赋为 0。
- 计算从起始节点到所有其他节点的最短距离
需要在循环中进行以下操作:
- 找到距离起始节点最近的未访问节点
具体实现中,可以遍历整个节点集合,找到未访问节点中距离起始节点最近的节点,将其标记为当前节点。
- 标记当前节点为已访问
需要将当前节点标记为已访问,将其 visited 数组值设为 true。
- 更新起始节点到其他节点的距离
需要遍历当前节点的相邻节点,计算从起始节点到该节点的距离,并更新 distance 数组中该节点的距离值,如果计算出的距离值比当前 distance 数组中该节点的距离值更小,则更新为该值。
这个循环将一直执行到所有节点都被访问为止,或者找不到距离起始节点最近的未访问节点。
- 返回 distance 数组
算法执行结束后,需要返回 distance 数组,其中 distance[i] 表示起始节点到节点 i 的最短距离。
2.完整代码实现
package main
import (
"fmt"
"math"
)
// Dijkstra 算法用于计算无向图的最短路径
func dijkstra(graph [][]int, startNode int) []int {
// 获取节点数
nodesCount := len(graph)
// 初始化 visited 和 distance 数组
visited := make([]bool, nodesCount)
distance := make([]int, nodesCount)
for i := 0; i < nodesCount; i++ {
visited[i] = false
distance[i] = math.MaxInt32 // 赋初值为最大值
}
// 起始节点到自身的距离为 0
distance[startNode] = 0
// 计算从起始节点到所有其他节点的最短距离
for i := 0; i < nodesCount-1; i++ {
minDistance := math.MaxInt32 // 最短距离的初始值为最大值
currentNode := -1
// 找到距离起始节点最近的未访问节点
for j := 0; j < nodesCount; j++ {
if !visited[j] && distance[j] < minDistance {
minDistance = distance[j]
currentNode = j
}
}
// 如果没有找到最近的未访问节点,则退出循环
if currentNode == -1 {
break
}
// 标记当前节点为已访问
visited[currentNode] = true
// 更新起始节点到其他节点的距离
for j := 0; j < nodesCount; j++ {
if graph[currentNode][j] != -1 {
newDistance := distance[currentNode] + graph[currentNode][j]
if newDistance < distance[j] {
distance[j] = newDistance
}
}
}
}
return distance
}
func main() {
// 初始化无向图
graph := [][]int{
{-1, 2, -1, 6, -1},
{2, -1, 3, 8, 5},
{-1, 3, -1, -1, 7},
{6, 8, -1, -1, 9},
{-1, 5, 7, 9, -1},
}
startNode := 0 // 起始节点为 0
distances := dijkstra(graph, startNode)
// 输出起始节点到其他节点的最短距离
fmt.Println("Shortest distances from node", startNode, "to all other nodes:")
for i, d := range distances {
fmt.Printf("Node %d: %d\n", i, d)
}
}
这个程序实现了一个简单的 Dijkstra 算法来计算给定无向图的最短路径。它通过一个二维数组 graph 表示图中节点之间的连通性和距离。graph[i][j] 表示节点 i 和 j 之间的距离,如果它们之间没有边相连,则值为 -1。然后,程序调用 dijkstra 函数来计算从指定起始节点到所有其他节点的最短距离,并将结果输出到控制台。