C语言编程求用Dijkstra标号法求如图二中v0到v5的最短路径
时间: 2024-02-28 09:53:32 浏览: 74
计算最短路径的Dijkstra算法的编程实现.docx
好的,以下是用C语言编写的Dijkstra算法的代码,可以求出图中v0到v5的最短路径:
```
#include <stdio.h>
#define INF 0x3f3f3f3f // 定义正无穷
int graph[6][6] = { // 图的邻接矩阵表示
{0, 10, INF, INF, INF, 5},
{INF, 0, 1, INF, 2, INF},
{INF, INF, 0, 4, INF, INF},
{7, INF, 6, 0, INF, INF},
{INF, 3, 9, 2, 0, 8},
{INF, INF, INF, INF, INF, 0}
};
int Dijkstra(int start, int end)
{
int dist[6]; // 存储v0到各点的最短距离
int flag[6]; // 标记每个点是否已经访问过
int i, j, k, min;
// 初始化
for (i = 0; i < 6; i++) {
dist[i] = graph[start][i]; // v0到各点的距离
flag[i] = 0; // 标记初始化
}
flag[start] = 1; // 起点标记为已访问
// Dijkstra核心代码
for (i = 1; i < 6; i++) { // 遍历所有节点
min = INF;
for (j = 0; j < 6; j++) { // 找到距离v0最近的节点
if (flag[j] == 0 && dist[j] < min) {
min = dist[j];
k = j;
}
}
flag[k] = 1; // 标记该节点已访问
for (j = 0; j < 6; j++) { // 更新v0到其他节点的距离
if (flag[j] == 0 && dist[j] > dist[k] + graph[k][j]) {
dist[j] = dist[k] + graph[k][j];
}
}
}
return dist[end]; // 返回v0到v5的最短距离
}
int main()
{
int distance = Dijkstra(0, 5); // 求v0到v5的最短距离
printf("v0到v5的最短距离是:%d\n", distance);
return 0;
}
```
代码解释:
首先定义了一个邻接矩阵`graph`,表示给定的图。每个元素表示对应节点之间的距离,如果不连通则表示为正无穷。
Dijkstra函数的参数是起点`start`和终点`end`,返回值是起点到终点的最短距离。
在函数内部,首先初始化`dist`和`flag`数组。`dist`数组表示起点到各点的距离,`flag`数组表示每个点是否已经访问过。初始化时,将起点到各点的距离标记为邻接矩阵中的值,将所有节点的访问状态都设为未访问。
接着进入Dijkstra的核心代码。外层循环遍历所有节点,内层循环找到距离起点最近的未访问节点,并将其标记为已访问。然后更新起点到其他节点的距离,如果经过该节点到达另一个节点的距离比之前的更短,则更新距离。
最后返回起点到终点的最短距离。
在main函数中调用Dijkstra函数,求出v0到v5的最短距离并打印输出。
希望对你有所帮助!
阅读全文