请用C语言按照要求写程序:(1)实现图的邻接矩阵存储; (2)输入地图,设计实现最短路径Djkstra算法
时间: 2023-06-15 07:05:44 浏览: 60
以下是C语言实现图的邻接矩阵存储和Djkstra算法的示例代码:
```c
#include <stdio.h>
#include <limits.h> // 用于定义INT_MAX
#define MAX_VERTICES 100 // 最大顶点数
// 图的邻接矩阵存储结构
typedef struct {
int n; // 顶点数
int weight[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
} Graph;
// Djkstra算法,求图G从顶点v出发到其他顶点的最短路径
void Djkstra(Graph G, int v, int *dist, int *prev) {
int i, j, k, min;
int visited[MAX_VERTICES]; // 标记顶点是否已经访问
// 初始化
for (i = 0; i < G.n; i++) {
visited[i] = 0;
dist[i] = G.weight[v][i];
if (dist[i] < INT_MAX) {
prev[i] = v;
}
else {
prev[i] = -1;
}
}
visited[v] = 1;
dist[v] = 0;
// 主循环
for (i = 1; i < G.n; i++) {
min = INT_MAX;
// 找未访问顶点中距离最近的
for (j = 0; j < G.n; j++) {
if (!visited[j] && dist[j] < min) {
min = dist[j];
k = j;
}
}
visited[k] = 1;
// 更新距离和前驱顶点
for (j = 0; j < G.n; j++) {
if (!visited[j] && G.weight[k][j] < INT_MAX && dist[k] + G.weight[k][j] < dist[j]) {
dist[j] = dist[k] + G.weight[k][j];
prev[j] = k;
}
}
}
}
int main() {
Graph G;
int i, j, v;
int dist[MAX_VERTICES]; // 存放最短路径长度
int prev[MAX_VERTICES]; // 存放最短路径的前驱顶点
// 输入顶点数和邻接矩阵
printf("请输入顶点数:");
scanf("%d", &G.n);
printf("请输入邻接矩阵:\n");
for (i = 0; i < G.n; i++) {
for (j = 0; j < G.n; j++) {
scanf("%d", &G.weight[i][j]);
if (G.weight[i][j] == 0) {
G.weight[i][j] = INT_MAX;
}
}
}
// 输入起始顶点
printf("请输入起始顶点:");
scanf("%d", &v);
// 求最短路径
Djkstra(G, v, dist, prev);
// 输出结果
for (i = 0; i < G.n; i++) {
printf("从顶点%d到顶点%d的最短路径长度为%d,路径为:", v, i, dist[i]);
j = i;
while (j != v && prev[j] != -1) {
printf("%d <- ", j);
j = prev[j];
}
if (j == v) {
printf("%d\n", j);
}
else {
printf("无\n");
}
}
return 0;
}
```
程序首先定义了一个Graph结构体,用于存储图的邻接矩阵;然后定义了Djkstra算法,求出从指定顶点出发到其他顶点的最短路径;最后在main函数中输入邻接矩阵和起始顶点,调用Djkstra函数求解最短路径,并输出结果。