带权有向图采用领接矩阵存储,设计算法实现从源点出发的最短路径dijkstra
时间: 2024-01-10 09:04:31 浏览: 94
以下是带权有向图采用领接矩阵存储,实现从源点出发的最短路径 Dijkstra 算法的代码实现:
```c
#include <stdio.h>
#define MAX_VERTEX_NUM 100
#define INF 999999
typedef struct {
int vertex[MAX_VERTEX_NUM];
int edge[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vertex_num, edge_num;
} Graph;
void dijkstra(Graph G, int s, int dist[], int path[]) {
int i, j, k, min;
int visited[MAX_VERTEX_NUM];
// 初始化 visited、dist 和 path 数组
for(i = 0; i < G.vertex_num; i++) {
visited[i] = 0; // 表示顶点 i 没有被访问过
dist[i] = G.edge[s][i];
if(G.edge[s][i] < INF)
path[i] = s; // 表示从源点 s 到顶点 i 的最短路径经过的前一个顶点是 s
else
path[i] = -1; // 表示从源点 s 到顶点 i 没有路径
}
visited[s] = 1; // 源点 s 被访问过
path[s] = -1; // 源点 s 没有前一个顶点
// 循环执行 n-1 次
for(i = 1; i < G.vertex_num; i++) {
min = INF;
// 找出当前未访问的顶点中与源点 s 距离最短的顶点 k
for(j = 0; j < G.vertex_num; j++)
if(!visited[j] && dist[j] < min) {
min = dist[j];
k = j;
}
visited[k] = 1; // 顶点 k 被访问过
// 更新当前最短路径和前一个顶点
for(j = 0; j < G.vertex_num; j++)
if(!visited[j] && G.edge[k][j] < INF && dist[k] + G.edge[k][j] < dist[j]) {
dist[j] = dist[k] + G.edge[k][j];
path[j] = k;
}
}
}
int main() {
Graph G;
int s, i, j;
int dist[MAX_VERTEX_NUM]; // 存储源点 s 到各顶点的最短距离
int path[MAX_VERTEX_NUM]; // 存储源点 s 到各顶点的最短路径
printf("请输入顶点数和边数:");
scanf("%d %d", &G.vertex_num, &G.edge_num);
printf("请输入顶点:");
for(i = 0; i < G.vertex_num; i++)
scanf("%d", &G.vertex[i]);
// 初始化领接矩阵
for(i = 0; i < G.vertex_num; i++)
for(j = 0; j < G.vertex_num; j++)
G.edge[i][j] = INF;
printf("请输入边的信息和权值:");
for(i = 0; i < G.edge_num; i++) {
int v1, v2, w;
scanf("%d %d %d", &v1, &v2, &w);
int p1, p2;
// 查找顶点 v1、v2 在 G.vertex 数组中的下标
for(j = 0; j < G.vertex_num; j++) {
if(G.vertex[j] == v1) p1 = j;
if(G.vertex[j] == v2) p2 = j;
}
G.edge[p1][p2] = w;
}
printf("请输入源点:");
scanf("%d", &s);
dijkstra(G, s, dist, path);
printf("源点是 %d:\n", s);
for(i = 0; i < G.vertex_num; i++) {
printf("到顶点 %d 的距离是 %d,路径是:", G.vertex[i], dist[i]);
if(path[i] == -1)
printf("无路径");
else {
int p = i;
while(path[p] != -1) {
printf("%d<-", G.vertex[p]);
p = path[p];
}
printf("%d", G.vertex[p]);
}
printf("\n");
}
return 0;
}
```
注意:此代码仅为示例,实际应用中需要根据具体情况进行适当修改。
阅读全文