#define INF 0X3F3F3F3F #define MAXSIZE 100 // 数组的最大容量 // 使用链式存储边,建图 struct node { int begin; // 边的始点 int end; // 边的终点 int cost; // 边的代价 int next; // 当前边的下一条相邻边 // int reverse; // 反向边的编号 } e[1010]; int head[1010]; // head[i]存储与该点相邻的边 int dis[1010]; // 存放源点到每个点的最短距离 int visit[1010]; // 标记哪些点被访问,访问的点被设为1 int tar[1010]; // 追踪最短路径 int path_length[100];// 存放已经获得的最短路径长度 int size=14; //初始时str长度 string str[MAXSIZE] = { " ","entrance","lecture hall","library","restaurant 1","rock-climb","grove", "gym","playground","grassland","volleyball court","basketball court","rerstaurant 2","exit" }; 我这里已经为你做好了链式前向星存图的准备,请写一个基于链式前向星法的Floyd函数实现查找两点之间最短路径
时间: 2024-04-12 16:27:05 浏览: 145
二叉树的层序创建和后续遍历(代码实现)
这是一个基于链式前向星法的Floyd函数实现查找两点之间最短路径的示例代码:
```cpp
void Floyd(int n) {
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (dis[i] + e[k].cost < dis[j]) {
dis[j] = dis[i] + e[k].cost;
tar[j] = tar[i];
}
}
}
}
}
int main() {
int n = 13; // 图中顶点的个数
int m = 20; // 边的个数
// 初始化dis数组和tar数组
memset(dis, INF, sizeof(dis));
memset(tar, -1, sizeof(tar));
// 构建图中的边
for (int i = 1; i <= m; i++) {
int u, v, w;
// 读入边的信息,包括始点u,终点v,代价w
scanf("%d%d%d", &u, &v, &w);
e[i].begin = u;
e[i].end = v;
e[i].cost = w;
e[i].next = head[u];
head[u] = i;
}
// 初始化源点到自身的最短距离为0
dis[1] = 0;
// 调用Floyd函数计算最短路径
Floyd(n);
// 输出最短路径的结果
for (int i = 2; i <= n; i++) {
int cur = i;
int index = 0;
while (cur != 1) {
path_length[index++] = cur;
cur = tar[cur];
}
printf("最短路径长度为:%d,路径为:", dis[i]);
printf("1 -> ");
for (int j = index - 1; j >= 0; j--) {
printf("%d -> ", path_length[j]);
}
printf("%d\n", i);
}
return 0;
}
```
这段代码实现了基于链式前向星法的Floyd函数,可以计算图中任意两点之间的最短路径。其中,n表示图中顶点的个数,m表示边的个数。你可以根据实际需求修改顶点个数和边的信息。输出结果为每一对顶点之间的最短路径长度和路径。
阅读全文