题目描述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 数组,站点可直接到达值则为站点间距离,否则值为0vector<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"void SubwayRoute::init_staInf(vector<string>& stations, vector<route>& stas) {stationNums = stations.size();//初始化站点数量staName = stations;//站点信息初始化 各站点对应编号以及名称int no = 0;for (auto& sta : stations) {staNo[sta] = no++;//哈希表记录各站点对应的编号}vector<vector<int>> tmp(stationNums, vector<int>(stationNums, 0));staInf = tmp;for (route& r : stas) {staInf[r.startSta][r.endSta] = staInf[r.endSta][r.startSta] = r.distance;}
}void SubwayRoute::printRouteInf() {cout << "邻接矩阵"<< endl <<"● 表示两站点直接连通 ○ 表示站点间不能直接到达" << endl<< "   ";for (int i = 0; i < stationNums; i++) {cout << staName[i] << " ";}cout << endl ;for (int i = 0; i < stationNums; i++) {cout << staName[i] << " ";for (int j = 0; j < stationNums; j++) {if (staInf[i][j]) cout << "●";else cout << "○";}cout << endl;}
}void SubwayRoute::floydAlgorithm() {vector<vector<int>> Graph(stationNums, vector<int>(stationNums));//创建floyd算法矩阵vector<vector<int>> Path(stationNums, vector<int>(stationNums, -1));//path数组初始化//根据 staInf 站点距离信息矩阵填充Graph数组,为0的部分改为INT_MAX,其余不变for (int i = 0; i < stationNums; i++) {for (int j = 0; j < stationNums; j++) {if (i == j) {Graph[i][j] = 0;}else if (staInf[i][j] > 0) {Graph[i][j] = staInf[i][j];}else if(staInf[i][j] == 0)Graph[i][j] = INT_MAX / 2;//初始设置为无穷大 表示两点间不能直接到达}}for (int v = 0; v < stationNums; v++) {for (int i = 0; i < stationNums; i++) {for (int j = 0; j < stationNums; j++) {if (Graph[i][j] > Graph[v][j] + Graph[i][v]) {Graph[i][j] = Graph[v][j] + Graph[i][v];Path[i][j] = v;}}}}printMinRoute(sstation, estation, Path);//打印路径cout << "路径长度为 " << minDis;
}
//
void SubwayRoute::printMinRoute(int u, int v, vector<vector<int>>& Path) {if (Path[u][v] == -1) {minDis += staInf[u][v];//记录路径距离cout << staName[u] << "->" << staName[v] << "距离为:" << staInf[u][v] << endl;}else {int mid = Path[u][v];printMinRoute(u, mid, Path);printMinRoute(mid, v, Path);}
}int main() {//各站点名vector<string> stations{ "A","B","C","D","E","F","G","H","I","J","K","L","M","N" };//各站点信息 使用结构体 route 表示vector<route> stas{ route(0,1,2),route(1,2,4),route(2,8,7),route(2,13,8),route(2,3,5),route(3,4,11),route(4,5,6),route(5,6,3),route(6,7,1),route(8,9,5),route(9,10,8),route(10,5,4),route(13,12,6),route(12,11,7),route(11,5,10) };//创建类对象SubwayRoute sr;//传入 stations 以及 stas 初始化对象属性sr.init_staInf(stations, stas);//打印邻接矩阵sr.printRouteInf();//字符串保存输入的站点名并判断站点是否合法string sta("");cout << "请输入起始站: (A ~ E)" << endl;cin >> sta;while (sr.staNo.find(sta) == sr.staNo.end()) {cout << "无此站点,请重新输入!" << endl;cin >> sta;}sstation = sr.staNo[sta];cout << "请输入终点站:(A ~ E)" << endl;cin >> sta;while (sr.staNo.find(sta) == sr.staNo.end()) {cout << "无此站点,请重新输入!" << endl;cin >> sta;}estation = sr.staNo[sta];sr.floydAlgorithm();//调用弗洛伊德求解 sstation 到 estation 的最短路径return 0;
}

运行图

floyd算法求解地铁路线问题相关推荐

  1. Floyd算法求解最短路径

    Floyd算法求解最短路径 1.算法概述 2.算法实例 3.算法实战 3.1 算法描述 3.2 解题思路 3.3 代码实现 1.算法概述   Floyd算法又称为插点法,是一种利用动态规划的思想寻找给 ...

  2. Floyd算法求解最短距离

    1.问题 用Floyd算法求解下图各个顶点的最短距离.写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵). 2.解析 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权 ...

  3. BFS算法之地铁路线问题

    问题描述 假设有两条地铁线路,1 号线为直线线路,2 号线为环线线路, 假设 1 号线的各个站点名称分别为 "A" "B" "C" &quo ...

  4. 弗洛伊德(Floyd)算法求解图的最短路径

    弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...

  5. 【优化布局】基于免疫算法求解充电站最优布局matlab代码

    1 简介 为了普及电动汽车,以缓解我国日益严重的环境能源问题,本文研究电动汽车充换电站的选址方法,旨在利用提高电动汽车充电设施的覆盖范围,加快电动汽车的普及发展.本文建立人们日常出行模型,模拟电动汽车 ...

  6. Floyd算法、Dijkstra算法例题

    二 1.用Floyd算法求解下图各个顶点的最短距离. 2.对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径. 2.解析 1)用Floyd算法求解各个顶点的最短距离. 第一步:画出初始化距离 ...

  7. 1128 信使(floyd算法)

    1. 问题描述: 战争时期,前线有 n 个哨所,每个哨所可能会与其他若干个哨所之间有通信联系.信使负责在哨所之间传递信息,当然,这是要花费一定时间的(以天为单位).指挥部设在第一个哨所.当指挥部下达一 ...

  8. floyd算法java_利用JAVA和Floyd算法实现上海地铁最短路线搜索系统

    [实例简介] Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路. [实例截图] [核心代码] SUBWAY └── SUBWAY ├── bin │   ...

  9. 迪杰斯特拉算法-西安地铁最短路线问题

    文章说明 图是一种较线性表和树更为复杂的数据结构,在各个领域都有着广泛的应用,如城市交通.电路网络分析.交通灯的设置等,其中,最短路径问题的求解是日常生活中最为常见的问题.在现实生活和生产实践中,有许 ...

最新文章

  1. 上海大学c语言程序设计,【基础强化】2020-2021学年秋季学期程序设计C语言项目顺利开展...
  2. linux下zip2
  3. 《unix设备驱动》内存分配
  4. [LeetCode]#13 3sum
  5. 网络工程师Day1--实验1-4 配置三层交换
  6. [渝粤教育] 天津科技大学 人工智能导论 参考 资料
  7. Prometheus监控(二)
  8. 在新款mac上找回经典的开机启动声,一条命令轻松搞定
  9. 6.数据结构 --- 树和二叉树
  10. php utc时区设置,php DateTimeZone 设置UTC 无效
  11. 拓端tecdat|约会数据动态可视化分析:R语言使用ggplot和ganimate制作的动画图
  12. vue.js下载教程
  13. 谷歌pixel手机解BL锁、刷机、破解电信(史上最详细的帖子)
  14. Linux编译并更新内核(替换Linux内核)
  15. 上海自考02290 c++语言程序设计试卷,上海交通大学工业自动化专业自考本科招生简章...
  16. macOS Outlook 查看邮件的源码 HTML源码
  17. 子网掩码及其与IP地址、网关的关系
  18. 机器学习基础——损失函数与风险函数
  19. 苹果云服务器里的家人共享位置,iPhone手机“家人共享”是什么?苹果手机怎么使用“家人共享”?...
  20. Android 性能优化五大误区和两大疑点!

热门文章

  1. 一种专家数据库的开发与实现 (转)
  2. 案例 | 沃尔玛 x 腾讯云 Serverless 应用实践,全力保障消费者购物体验
  3. 《行为经济学》北京大学 孟涓涓 第四章
  4. Assembly x64 Intro - XMM ABS
  5. ROS系统安装Kinetic(零基础教程)
  6. [catsVSdogs]猫狗大战代码注释讲解_1
  7. 吉首大学2019年程序设计竞赛 E——多喝嘤料
  8. AD9361、AD9613高速AD采集处理开发案例,基于C6678+Kintex-7
  9. pu是什么单位(pu革是什么材料)
  10. 第七讲:5.物联网开关——自动化控制任务光照控制台灯实验例程