c语言实现最短路径问题实际上是带权有向图(网)的一种应用,用Dijkstra算法求两个顶点间的最短路径。备注:输入的有向网信息中0表示不存在顶点到自身的弧,32767表示两个顶点之间不存在弧。 【输入形式】带权有向图(网)的顶点数及,有向图(网)的信息,出发顶点。 【输出形式】输出出发顶点到有向图(网)其余顶点间的最短路径长度及其路径。 【样例输入】 输入顶点数: 7 输入有向网的信息: 0 4 6 6 32767 32767 32767 32767 0 1 32767
时间: 2023-11-22 07:54:38 浏览: 147
以下是用Dijkstra算法求解最短路径的C语言代码实现:
```c
#include <stdio.h>
#define MAXVEX 100 // 最大顶点数
#define INFINITY 32767 // 权值为无穷大
typedef struct {
int arc[MAXVEX][MAXVEX]; // 邻接矩阵
int numVertexes; // 顶点数
} MGraph;
void Dijkstra(MGraph G, int v0, int *dist, int *path) {
int i, j, k, min;
int final[MAXVEX]; // 标记已经求得最短路径的顶点集合
// 初始化
for (i = 0; i < G.numVertexes; i++) {
final[i] = 0; // 初始化为未知最短路径状态
dist[i] = G.arc[v0][i]; // 初始化距离向量
path[i] = -1; // 记录路径
}
dist[v0] = 0;
final[v0] = 1;
// 求解最短路径
for (i = 1; i < G.numVertexes; i++) {
min = INFINITY;
for (j = 0; j < G.numVertexes; j++) {
if (!final[j] && dist[j] < min) { // 找到当前未知最短路径中距离v0最近的顶点k
min = dist[j];
k = j;
}
}
final[k] = 1; // 将顶点k加入已知最短路径集合
for (j = 0; j < G.numVertexes; j++) { // 更新距离向量和路径向量
if (!final[j] && (min + G.arc[k][j] < dist[j])) {
dist[j] = min + G.arc[k][j];
path[j] = k;
}
}
}
}
int main() {
MGraph G;
int v0, i, j;
int dist[MAXVEX], path[MAXVEX];
printf("输入顶点数:");
scanf("%d", &G.numVertexes);
printf("输入有向网的信息:\n");
for (i = 0; i < G.numVertexes; i++) {
for (j = 0; j < G.numVertexes; j++) {
scanf("%d", &G.arc[i][j]);
}
}
printf("输入出发顶点:");
scanf("%d", &v0);
Dijkstra(G, v0, dist, path);
// 输出最短路径
for (i = 0; i < G.numVertexes; i++) {
if (dist[i] == INFINITY) {
printf("%d到%d没有路径\n", v0, i);
} else {
printf("%d到%d的最短路径长度为:%d,路径为:", v0, i, dist[i]);
j = i;
while (path[j] != -1) {
printf("%d<-", j);
j = path[j];
}
printf("%d\n", j);
}
}
return 0;
}
```
以上代码中,`MGraph` 结构体定义了邻接矩阵和顶点数,`Dijkstra` 函数实现了 Dijkstra 算法,`main` 函数中读取输入数据,调用 `Dijkstra` 函数求解最短路径,并输出结果。
阅读全文