题目描述Description
假设有两条地铁线路,1 号线为直线线路,2 号线为环线线路,
假设 1 号线的各个站点名称分别为 “A” “B” “C” “D” “E”“F” “G” “H”
2号线的各个站点名称分别为"C" “I” “J” “K” “F” “L” “M” “N”;
另外,假设地铁都是双向运行的。 现给出两个地铁站名分别作为起点和终点,请给出从起点到终点至少需要多少站。
假如各个地铁站之间的距离不是相等的,相邻地铁站之间的距离保存在另
外一个数组中,应如何计算两个地铁站之间的最近距离。

在BFS算法之地铁路线问题一文中我们仅仅解决了两站点间经过最少站点的走法,但放眼现实生活,我们选择地铁线路的时候中间站点数量不是选择唯一的标准,某些时候我们想知道任意两站点间怎样走距离是最近的。
Floyd算法
求两个站点之间的最短距离问题可以转化为求解图中任意两点的最短距离,对于这类问题使用 Floyd算法 是可行的。
对于 Graph 矩阵:
i == j 时: Graph[i][j] == 0 站点距离为0
例: A站到A站距离为0
Graph[i][j] == ∞ 表示站 i 不可直接到达 j
j 不是 i 的直接后继

实现代码(含注释)
头文件
#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
static int sstation;//起始站点
static int estation;//终止站点
struct route {
//表示路线,即图中的每条边
int startSta;//起始站点编号
int endSta;//可以直接到达的下一站站点编号
int distance;//站点间距离
route(int s, int e, int d = 0) :startSta(s), endSta(e), distance(d) {
}//构造函数
};
class SubwayRoute {
friend int main();//声明主函数为友元函数
int stationNums = 0;//站点数目
int minDis = 0;//记录最小距离
vector<string> staName;//各站点名
unordered_map<string, int> staNo;//每个站点对应的编号 如 A -> 0 的映射关系
//staInf 数组,站点可直接到达值则为站点间距离,否则值为0
vector<vector<int>> staInf;//邻接矩阵法存储站点间的信息:是否可以直接到达以及站点间距离
void init_staInf(vector<string>& stations, vector<route>& stas);//初始化站点信息
void printRouteInf();//打印邻接矩阵
void floydAlgorithm();//floyd算法求解任意两点间的最短路径
void printMinRoute(int u, int v, vector<vector<int>>& Path);//打印最短路径
};
源文件
#include "地铁路线问题(含有路线距离).h"
弗洛伊德算法在地铁线路中的最短路径计算

本文介绍如何利用Floyd算法解决地铁线路中的最短路径问题,通过实例演示如何计算任意两点之间的最短距离,包括初始化邻接矩阵、应用Floyd迭代法,并提供了一个完整的C++代码实现。
最低0.47元/天 解锁文章
545

被折叠的 条评论
为什么被折叠?



