C语言使用邻接矩阵储存结构构建有向带权图并给出相应的狄克斯特拉算法
时间: 2024-03-14 21:44:28 浏览: 110
C语言版图的数据结构求最短路径(高校导航系统).zip
好的,我可以为您提供C语言使用邻接矩阵储存结构构建有向带权图并给出相应的狄克斯特拉算法的示例代码。
首先,我们需要定义一个邻接矩阵来存储图的边和权值。假设我们的图有n个顶点,则可以定义一个n*n的二维数组来表示邻接矩阵。其中,数组元素a[i][j]表示从顶点i到顶点j的边的权值。如果i和j之间没有边相连,则a[i][j]为0。
下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <limits.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef int VertexType; // 顶点类型
typedef int EdgeType; // 权值类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 顶点数组
EdgeType edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, edgenum; // 顶点数和边数
} MGraph;
void Dijkstra(MGraph G, int v0, int dist[], int path[]) {
int s[MAX_VERTEX_NUM]; // 标记数组,初始时所有顶点都未被访问
int i, j, k, min;
for(i = 0; i < G.vexnum; i++) {
dist[i] = G.edges[v0][i]; // 初始化最短路径数组
s[i] = 0; // 初始化标记数组
if(dist[i] < INT_MAX) path[i] = v0; // 初始化路径数组
else path[i] = -1;
}
dist[v0] = 0; // v0到v0的距离为0
s[v0] = 1; // 标记v0已访问
for(i = 1; i < G.vexnum; i++) { // 遍历剩余的n-1个顶点
min = INT_MAX;
for(j = 0; j < G.vexnum; j++) { // 找到未访问的距离v0最近的顶点k
if(!s[j] && dist[j] < min) {
min = dist[j];
k = j;
}
}
s[k] = 1; // 标记顶点k已访问
for(j = 0; j < G.vexnum; j++) { // 更新最短路径数组dist和路径数组path
if(!s[j] && G.edges[k][j] < INT_MAX && dist[k] + G.edges[k][j] < dist[j]) {
dist[j] = dist[k] + G.edges[k][j];
path[j] = k;
}
}
}
}
int main() {
MGraph G;
int v0 = 0, dist[MAX_VERTEX_NUM], path[MAX_VERTEX_NUM];
int i, j, k, w;
printf("请输入顶点数和边数:");
scanf("%d%d", &G.vexnum, &G.edgenum);
printf("请输入顶点信息:");
for(i = 0; i < G.vexnum; i++) {
scanf("%d", &G.vexs[i]);
}
for(i = 0; i < G.vexnum; i++) {
for(j = 0; j < G.vexnum; j++) {
G.edges[i][j] = INT_MAX; // 将邻接矩阵的元素初始化为最大值
}
}
printf("请输入每条边的起点、终点和权值:\n");
for(k = 0; k < G.edgenum; k++) {
scanf("%d%d%d", &i, &j, &w);
G.edges[i][j] = w; // 将边的权值存入邻接矩阵
}
Dijkstra(G, v0, dist, path);
printf("从顶点%d到其他各顶点的最短路径长度为:\n", v0);
for(i = 0; i < G.vexnum; i++) {
printf("%d ", dist[i]);
}
printf("\n从顶点%d到其他各顶点的最短路径为:\n", v0);
for(i = 0; i < G.vexnum; i++) {
printf("%d ", v0);
j = i;
while(path[j] != v0 && path[j] != -1) {
printf("%d ", path[j]);
j = path[j];
}
if(path[j] == v0) printf("%d\n", j);
else printf("不可达\n");
}
return 0;
}
```
以上代码实现了一个简单的有向带权图,并使用狄克斯特拉算法求解从指定顶点到其他顶点的最短路径。您可以根据自己的需要进行修改和扩展。
阅读全文