用dijkstra算法求最短路径问题,输入顶点数,各边权值,出发顶点,输出最短路径,C语言
时间: 2023-08-15 16:06:13 浏览: 85
C++求所有顶点之间的最短路径(用Dijkstra算法)
下面是使用 Dijkstra 算法求解最短路径的 C 代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
// 定义顶点数量
#define VERTICES 6
// 定义无穷大
#define INFINITE INT_MAX
// 定义邻接矩阵
int graph[VERTICES][VERTICES] = {
{0, 1, 3, INFINITE, INFINITE, INFINITE},
{1, 0, 1, 4, 2, INFINITE},
{3, 1, 0, 2, INFINITE, INFINITE},
{INFINITE, 4, 2, 0, 5, 1},
{INFINITE, 2, INFINITE, 5, 0, 1},
{INFINITE, INFINITE, INFINITE, 1, 1, 0}
};
// Dijkstra 算法
void dijkstra(int start) {
int dist[VERTICES]; // 保存起点到各个顶点的最短距离
int visited[VERTICES] = {0}; // 记录每个顶点是否已经被访问
int i, j, min, u;
// 初始化 dist 数组
for (i = 0; i < VERTICES; i++) {
dist[i] = graph[start][i];
}
// 起点到自身的距离为 0
dist[start] = 0;
visited[start] = 1;
// 处理剩余的 V-1 个顶点
for (i = 1; i < VERTICES; i++) {
min = INFINITE;
// 找到当前未访问的顶点中距离最近的顶点
for (j = 0; j < VERTICES; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
u = j;
}
}
// 标记该顶点为已访问
visited[u] = 1;
// 更新起点到其他顶点的最短距离
for (j = 0; j < VERTICES; j++) {
if (!visited[j] && graph[u][j] != INFINITE && dist[u] + graph[u][j] < dist[j]) {
dist[j] = dist[u] + graph[u][j];
}
}
}
// 输出结果
for (i = 0; i < VERTICES; i++) {
printf("起点到顶点 %d 的最短距离为 %d\n", i, dist[i]);
}
}
int main() {
dijkstra(0);
return 0;
}
```
上述代码中,我们使用了邻接矩阵来表示图,并使用了数组 `dist` 来保存起点到各个顶点的最短距离。在算法的主循环中,我们首先找到当前未访问的顶点中距离最近的顶点,然后将其标记为已访问,并更新起点到其他顶点的最短距离。
这里,我们假设图中所有边的权重都为正数。如果存在负权重的边,则需要使用其他算法,如 Bellman-Ford 算法。
阅读全文