使用迪杰斯特拉算法在图中找到所有节点对之间的最短路径的Golang程序

使用迪杰斯特拉算法在图中找到所有节点对之间的最短路径的Golang程序

在这篇Golang程序文章中,我们将学习如何使用一个名为Edge的结构体来表示图中的有权边。dijkstra函数仅需要输入节点数量n和Edge对象的切片即可。它返回一个表示图中所有节点对之间距离矩阵的二维切片。

在这篇Golang文章中,我们将探讨如何实现Dijkstra算法,以找到图中所有节点对之间的最短路径。

算法

  • 步骤1 − 首先,我们需要导入fmt和math包。然后定义一个名为Edge的结构体来表示图中的有权边,其中包含起始节点、结束节点和边权重。

  • 步骤2 − 定义一个名为dijkstra的函数,它需要输入节点数量n和Edge对象的切片,并返回表示图中所有节点对之间距离矩阵的二维切片。

  • 步骤3 − 初始化一个大小为n x n的邻接矩阵adj,并将所有条目设置为无穷大,除了对角线条目,其设置为0。基于输入切片中的边填充邻接矩阵。

  • 步骤4 − 初始化一个大小为n x n的距离矩阵dist,并将邻接矩阵中的值复制到其中。

  • 步骤5 − 使用三个嵌套循环计算所有节点对之间的最短路径。外部循环迭代所有节点k,内部循环迭代所有节点对i和j。

  • 步骤6 − 对于每一组节点,检查从i到k的距离加上从k到j的距离是否小于从i到j的当前距离。如果是,使用新的最短路径距离更新距离矩阵,并返回该矩阵。

  • 步骤7 − 现在,开始main()函数。在main()函数中,通过将图的边作为值传递给数组来初始化。

  • 步骤8 − 然后调用dijkastra()函数,并将上面初始化的数组作为参数传递给该函数,并将其获得的结果存储在一个变量中。

  • 步骤9 − 最后打印获得的始终,这是图中所有节点对之间的最短路径。

示例

以下示例表示距离矩阵,其中dist[i][j]表示从节点i到节点j的最短路径距离。例如, dist[0][1]等于5, 这意味着从节点0到节点1的最短路径具有权重5. 同样,dist[2][3]等于1,这意味着从节点2到节点3的最短路径具有权重1。

package main

import (
   "fmt"
   "math"
)

type Edge struct {
   from int
   to   int
   cost int
}

func dijkstra(n int, edges []Edge) [][]int {
   // 初始化邻接矩阵
   adj := make([][]int, n)
   for i := 0; i < n; i++ {
      adj[i] = make([]int, n)
      for j := 0; j < n; j++ {
         if i == j {
            adj[i][j] = 0
         } else {
            adj[i][j] = math.MaxInt32
         }
      }
   }

   // 构建邻接矩阵
   for _, e := range edges {
      adj[e.from][e.to] = e.cost
   }

   // 初始化距离矩阵
   dist := make([][]int, n)
   for i := 0; i < n; i++ {
      dist[i] = make([]int, n)
      copy(dist[i], adj[i])
   }

   // 计算所有对之间的最短路径
   for k := 0; k < n; k++ {
      for i := 0; i < n; i++ {
         for j := 0; j < n; j++ {
            if dist[i][k]+dist[k][j] < dist[i][j] {
               dist[i][j] = dist[i][k] + dist[k][j]
            }
         }
      }
   }
   return dist
}

func main() {
   n := 4
   edges := []Edge{
      {0, 1, 5},
      {0, 2, 10},
      {1, 2, 3},
      {2, 3, 1},
      {3, 0, 2},
   }
   fmt.Println("给定图的顶点是:", edges)
   dist := dijkstra(n, edges)
   fmt.Println("所有对之间的最短距离是:", dist)
}

输出

给定图的顶点是: [{0 1 5} {0 2 10} {1 2 3} {2 3 1} {3 0 2}]
所有对之间的最短距离是: [[0 5 8 9] [6 0 3 4] [3 8 0 1] [2 7 10 0]]

结论

我们已经成功编译并执行了一个Go语言程序,通过使用Dijkastra算法找到了图中所有对之间的最短路径。Dijkstra算法是在图中计算最短路径的强大工具,本文介绍的Go实现提供了一种清晰简单的方法,可以应用该算法来找到图中所有对之间的最短路径。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程