用c语言写一个图的最短路径,并可以自定义a到b,具体给出a到b的最短路径及其数值
时间: 2024-02-17 21:02:12 浏览: 86
图的最短路径(C语言)
4星 · 用户满意度95%
好的,以下是使用 Dijkstra 算法实现图的最短路径的 C 语言代码示例。其中,用户可以自定义起点和终点,程序会输出从起点到终点的最短路径及其长度。
```c
#include <stdio.h>
#include <stdlib.h>
#include <limits.h> // 定义了 INT_MAX
#define MAXVEX 100 // 最大顶点数
// 定义邻接矩阵结构体
typedef struct {
int vexs[MAXVEX]; // 存储顶点数据
int arcs[MAXVEX][MAXVEX]; // 存储边的关系,即邻接矩阵
int num_vexs; // 顶点数
int num_arcs; // 边数
} MGraph;
// 初始化邻接矩阵
void InitMGraph(MGraph *G) {
int i, j;
for (i = 0; i < G->num_vexs; i++) {
for (j = 0; j < G->num_vexs; j++) {
G->arcs[i][j] = INT_MAX; // 初始化为无穷大
}
}
}
// 创建邻接矩阵图
void CreateMGraph(MGraph *G) {
int i, j, k, w;
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->num_vexs, &G->num_arcs);
// 初始化邻接矩阵
InitMGraph(G);
// 输入顶点数据
printf("请输入顶点数据:\n");
for (i = 0; i < G->num_vexs; i++) {
scanf("%d", &G->vexs[i]);
}
// 输入边的关系,即邻接矩阵
printf("请输入边的关系,格式为:i j w,表示顶点 i 和 j 之间有一条权值为 w 的边:\n");
for (k = 0; k < G->num_arcs; k++) {
scanf("%d%d%d", &i, &j, &w);
G->arcs[i][j] = w;
G->arcs[j][i] = w; // 无向图需要将矩阵对称
}
}
// Dijkstra 算法求最短路径
void Dijkstra(MGraph G, int start, int end) {
int i, j, k;
int dist[MAXVEX]; // 存储起点到每个顶点的最短距离
int path[MAXVEX]; // 存储最短路径上每个顶点的前驱结点
int visited[MAXVEX]; // 存储顶点是否已访问
int min_dist, min_index;
// 初始化
for (i = 0; i < G.num_vexs; i++) {
visited[i] = 0;
dist[i] = G.arcs[start][i];
path[i] = start;
}
visited[start] = 1;
dist[start] = 0;
// 循环 n-1 次
for (i = 1; i < G.num_vexs; i++) {
min_dist = INT_MAX;
for (j = 0; j < G.num_vexs; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
min_index = j;
}
}
visited[min_index] = 1;
for (k = 0; k < G.num_vexs; k++) {
if (!visited[k] && dist[k] > dist[min_index] + G.arcs[min_index][k]) {
dist[k] = dist[min_index] + G.arcs[min_index][k];
path[k] = min_index;
}
}
}
// 输出从起点到终点的最短路径及其长度
printf("从顶点 %d 到顶点 %d 的最短路径为:", start, end);
if (dist[end] == INT_MAX) {
printf("不存在!\n");
} else {
printf("%d", end);
while (end != start) {
end = path[end];
printf(" <- %d", end);
}
printf("\n路径长度为:%d\n", dist[path[end]]);
}
}
int main() {
MGraph G;
int start, end;
CreateMGraph(&G);
printf("请输入起点和终点:\n");
scanf("%d%d", &start, &end);
Dijkstra(G, start, end);
return 0;
}
```
阅读全文