求用Dijkstra算法实现求单源最短路径的完整c语言代码
时间: 2023-08-12 10:18:03 浏览: 122
以下是使用Dijkstra算法实现求单源最短路径的完整C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define V 6 // 图中顶点数
#define INF INT_MAX // 表示两个顶点之间没有边
int graph[V][V] = { // 图的邻接矩阵表示法
{0, 6, INF, 5, INF, INF},
{INF, 0, 1, INF, INF, INF},
{INF, INF, 0, INF, 3, INF},
{INF, INF, INF, 0, INF, 9},
{INF, INF, INF, INF, 0, INF},
{INF, INF, INF, INF, INF, 0}
};
int dijkstra(int start, int end) {
int dist[V], visited[V], minDist, minIndex, i, j;
for (i = 0; i < V; i++) { // 初始化
visited[i] = 0;
dist[i] = graph[start][i];
}
visited[start] = 1; // 起点已访问
for (i = 1; i < V; i++) {
minDist = INF;
for (j = 0; j < V; j++) { // 找出未访问过的距离最短的顶点
if (!visited[j] && dist[j] < minDist) {
minDist = dist[j];
minIndex = j;
}
}
visited[minIndex] = 1; // 将找到的顶点标记为已访问
for (j = 0; j < V; j++) { // 更新距离
if (!visited[j] && graph[minIndex][j] != INF && dist[minIndex] + graph[minIndex][j] < dist[j]) {
dist[j] = dist[minIndex] + graph[minIndex][j];
}
}
}
return dist[end]; // 返回起点到终点的最短距离
}
int main() {
int start = 0, end = 5;
int shortestPath = dijkstra(start, end);
printf("从%d到%d的最短距离为:%d\n", start, end, shortestPath);
return 0;
}
```
注意,这里的图是一个有向带权图,采用邻接矩阵表示法。其中,`graph[i][j]`表示顶点i到j的边的权重。如果`graph[i][j]`的值为INF,表示顶点i和j之间没有边。在本代码中,我们假定起点为0,终点为5。在实际应用中,这些参数可以从外部输入。
阅读全文