golang实现Dijkstra算法

时间:2023-03-30 10:01:20

1.实现过程详解

Dijkstra 算法是一种用于计算无向图的最短路径的算法。它是基于贪心策略的,每次选择当前距离起始节点最近的未访问节点进行访问,并更新其相邻节点的距离值,以得到最短路径。

在实现 Dijkstra 算法时,需要按照以下步骤进行:

  1. 初始化 visited 和 distance 数组

首先,需要定义两个数组 visited 和 distance。visited 数组用于记录节点是否被访问过,distance 数组用于记录起始节点到各个节点的最短距离。

具体实现中,需要遍历整个节点集合,将 visited 数组初始化为 false,distance 数组初始化为一个足够大的值(例如 math.MaxInt32)。

  1. 起始节点到自身的距离为 0

起始节点到自身的距离为 0,需要将 distance 数组中起始节点的距离值赋为 0。

  1. 计算从起始节点到所有其他节点的最短距离

需要在循环中进行以下操作:

  • 找到距离起始节点最近的未访问节点

具体实现中,可以遍历整个节点集合,找到未访问节点中距离起始节点最近的节点,将其标记为当前节点。

  • 标记当前节点为已访问

需要将当前节点标记为已访问,将其 visited 数组值设为 true。

  • 更新起始节点到其他节点的距离

需要遍历当前节点的相邻节点,计算从起始节点到该节点的距离,并更新 distance 数组中该节点的距离值,如果计算出的距离值比当前 distance 数组中该节点的距离值更小,则更新为该值。

这个循环将一直执行到所有节点都被访问为止,或者找不到距离起始节点最近的未访问节点。

  1. 返回 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 函数来计算从指定起始节点到所有其他节点的最短距离,并将结果输出到控制台。