Dijkstra算法
一、概述
Dijkstra算法是一种用于找到图中最短路径的算法。
二、Dijkstra算法步骤
Dijkstra算法是一种用于求解带权图中单源最短路径的算法。以下是Dijkstra算法的步骤:
-
初始化:创建两个数组,一个用于记录每个节点的最短路径长度(dist数组),初始值为无穷大,另一个用于判断节点是否已经被访问(visited数组),初始值为未访问。
-
设置起点:将起点的最短路径长度设置为0,并将其标记为已访问。
-
更新最短路径:对于起点的所有邻接节点,计算通过起点到达该节点的路径长度,并更新dist数组中的最短路径长度。
-
选择最短路径节点:从未访问的节点中选择一个最短路径长度最小的节点,并将其标记为已访问。
-
更新其它节点的最短路径:对于刚被访问的节点的邻接节点,计算通过刚被访问的节点到达该邻接节点的路径长度,并更新dist数组中的最短路径长度。
-
重复步骤4和5,直到所有节点都被访问。
-
最短路径获取:根据dist数组中的最短路径长度,可以得到从起点到其他节点的最短路径。
三、相关代码
下面是用C语言编写的Dijkstra算法的代码示例:
c
#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;
}
// 设置起点的最短路径长度为0
dist[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。输出结果为每个节点的最短路径长度。