用c语言写 Floyd求得两个顶点间最短路径 功能描述:用Floyd算法求出from到to两点最小路径并返回(from,to是用创建图时,从1开始的整数编号) 参数说明:G-MGraph型指针参数 from-int型 最短路径开始顶点 to-int型 最短路径结束顶点 返回值说明:int型最短路径
时间: 2024-03-10 10:44:26 浏览: 54
任意两个顶点之间的最短路径_Floyd算法_C语言
4星 · 用户满意度95%
好的,这是一个关于用C语言实现Floyd算法求最短路径的问题。以下是代码实现:
```
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define INFINITY 2147483647 // 表示无穷大
typedef struct {
int **a; // 存放邻接矩阵
int vexNum; // 顶点数
int arcNum; // 弧数
} MGraph;
// 创建图
void createGraph(MGraph *G) {
int i, j, k, w;
// 初始化邻接矩阵
G->a = (int **)malloc(sizeof(int *) * G->vexNum);
for (i = 0; i < G->vexNum; i++) {
G->a[i] = (int *)malloc(sizeof(int) * G->vexNum);
for (j = 0; j < G->vexNum; j++) {
G->a[i][j] = INFINITY;
}
}
// 录入弧信息
for (k = 0; k < G->arcNum; k++) {
scanf("%d %d %d", &i, &j, &w);
G->a[i-1][j-1] = w;
}
}
// Floyd算法
void Floyd(MGraph *G, int **d, int **path) {
int i, j, k;
// 初始化d和path数组
for (i = 0; i < G->vexNum; i++) {
for (j = 0; j < G->vexNum; j++) {
d[i][j] = G->a[i][j];
path[i][j] = -1;
}
}
// 计算最短路径
for (k = 0; k < G->vexNum; k++) {
for (i = 0; i < G->vexNum; i++) {
for (j = 0; j < G->vexNum; j++) {
if (d[i][j] > d[i][k] + d[k][j]) {
d[i][j] = d[i][k] + d[k][j];
path[i][j] = k;
}
}
}
}
}
// 获取最短路径
int getShortestPath(MGraph *G, int from, int to) {
int i, j, k, p;
int **d, **path;
d = (int **)malloc(sizeof(int *) * G->vexNum);
path = (int **)malloc(sizeof(int *) * G->vexNum);
for (i = 0; i < G->vexNum; i++) {
d[i] = (int *)malloc(sizeof(int) * G->vexNum);
path[i] = (int *)malloc(sizeof(int) * G->vexNum);
}
Floyd(G, d, path);
p = path[from-1][to-1];
if (p == -1) {
return d[from-1][to-1];
}
else {
return getShortestPath(G, from, p+1) + getShortestPath(G, p+1, to);
}
}
```
这个函数实现了一个MGraph类型指针参数,一个起点from,一个终点to。它会返回from到to两点最短路径的长度。
阅读全文