C语言使用邻接矩阵储存结构构建有向带权图并给出相应的狄克斯特拉算法正确输出最简路径
时间: 2024-03-14 16:44:43 浏览: 135
有向图的邻接矩阵
5星 · 资源好评率100%
好的,让我来给你提供一份完整的代码,实现使用邻接矩阵储存结构构建有向带权图,并给出相应的狄克斯特拉算法,正确输出起点到终点的最短路径。
```c
#include <stdio.h>
#include <stdbool.h>
#define MAX_VERTICES 100 // 最大顶点数
#define INF 1000000000 // 无穷大
int graph[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int dist[MAX_VERTICES]; // 存储起点到各顶点的最短距离
bool visited[MAX_VERTICES]; // 标记各顶点是否已被访问
int path[MAX_VERTICES]; // 存储最短路径
int n; // 顶点数
// Dijkstra算法
void dijkstra(int start, int end) {
// 初始化
for (int i = 0; i < n; i++) {
dist[i] = INF;
visited[i] = false;
}
dist[start] = 0;
path[start] = -1;
// 求最短路径
for (int i = 0; i < n; i++) {
// 选择未访问的距离起点最近的顶点
int min_dist = INF;
int u;
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < min_dist) {
min_dist = dist[j];
u = j;
}
}
visited[u] = true;
// 更新与该顶点相邻的未访问顶点的距离
for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] != INF) {
if (dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
path[v] = u;
}
}
}
}
// 输出最短路径
printf("起点到终点的最短距离为:%d\n", dist[end]);
printf("最短路径为:");
int p = end;
while (p != -1) {
printf("%d ", p);
p = path[p];
}
printf("\n");
}
int main() {
// 读入顶点数和边数
int m;
printf("请输入顶点数和边数:");
scanf("%d %d", &n, &m);
// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = INF;
}
}
}
// 读入边的信息,构建邻接矩阵
printf("请输入每条边的起点、终点、边权:\n");
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
graph[u][v] = w;
}
// 读入起点和终点
int start, end;
printf("请输入起点和终点:");
scanf("%d %d", &start, &end);
// 使用Dijkstra算法求最短路径
dijkstra(start, end);
return 0;
}
```
在这个代码中,我们使用了一个数组 `path` 来存储最短路径。在求最短路径的过程中,每当更新一个顶点的最短距离时,就将其前一个顶点的下标存入 `path` 数组中。最后,我们可以通过 `path` 数组来输出最短路径。
如果您有任何疑问,请随时问我。
阅读全文