Dijkstra算法
- 一、概述
- 二、Dijkstra算法步骤
- 三、相关代码
一、概述
Dijkstra算法是一种用于找到图中最短路径的算法。
二、Dijkstra算法步骤
Dijkstra算法是一种用于求解带权图中单源最短路径的算法。以下是Dijkstra算法的步骤:
-
初始化:创建两个数组,一个用于记录每个节点的最短路径长度(dist数组),初始值为无穷大,另一个用于判断节点是否已经被访问(visited数组),初始值为未访问。
-
设置起点:将起点的最短路径长度设置为0,并将其标记为已访问。
-
更新最短路径:对于起点的所有邻接节点,计算通过起点到达该节点的路径长度,并更新dist数组中的最短路径长度。
-
选择最短路径节点:从未访问的节点中选择一个最短路径长度最小的节点,并将其标记为已访问。
-
更新其它节点的最短路径:对于刚被访问的节点的邻接节点,计算通过刚被访问的节点到达该邻接节点的路径长度,并更新dist数组中的最短路径长度。
-
重复步骤4和5,直到所有节点都被访问。
-
最短路径获取:根据dist数组中的最短路径长度,可以得到从起点到其他节点的最短路径。
三、相关代码
下面是用C语言编写的Dijkstra算法的代码示例:
#include <stdio.h>
#include <stdbool.h>// 定义无穷大的值
#define INFINITE 9999
#define MAX_NODES 10// 计算最短路径
void dijkstra(int graph[MAX_NODES][MAX_NODES], int start, int dist[MAX_NODES], bool visited[MAX_NODES]) {// 初始化dist数组和visited数组for (int i = 0; i < MAX_NODES; i++) {dist[i] = INFINITE;visited[i] = false;}// 设置起点的最短路径长度为0dist[start] = 0;// 寻找最短路径for (int count = 0; count < MAX_NODES - 1; count++) {int minDist = INFINITE;int minDistNode = -1;// 选择最短路径长度最小的节点for (int i = 0; i < MAX_NODES; i++) {if (!visited[i] && dist[i] < minDist) {minDist = dist[i];minDistNode = i;}}// 标记该节点为已访问visited[minDistNode] = true;// 更新其他节点的最短路径长度for (int i = 0; i < MAX_NODES; i++) {if (!visited[i] && graph[minDistNode][i] && dist[minDistNode] != INFINITE &&dist[minDistNode] + graph[minDistNode][i] < dist[i]) {dist[i] = dist[minDistNode] + graph[minDistNode][i];}}}
}int main() {int graph[MAX_NODES][MAX_NODES] = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};int start = 0;int dist[MAX_NODES];bool visited[MAX_NODES];dijkstra(graph, start, dist, visited);printf("节点\t最短路径长度\n");for (int i = 0; i < MAX_NODES; i++) {printf("%d\t%d\n", i, dist[i]);}return 0;
}
以上代码实现了Dijkstra算法的功能,可以计算带有权值的图中从起点到其他节点的最短路径长度。输入的图使用邻接矩阵表示,其中无连接的两个节点之间的距离为0。输出结果为每个节点的最短路径长度。