floyd算法求解地铁路线问题

算法总结六:图论中五花八门的算法 区别: 普通BFS Dijkstra Bellman-Ford Floyd-Warshall ================= 1.BFS主要适用于无权重向图中搜索出步骤最少的路径,当方向图存在权重时,不再适用; 2.Dijkstra主要用于有权重的方向图中搜索出最短、cost最小的路径,但不适合于有负权重的情况。 对于有环图,和BFS一样,标志好已处理的节点避免进入死循环,可以支持; 3.Bellman-Ford:负权重 4.Floyd-Warshall: 解决任意两点间的最短路径 ========== 阅读详情

题目描述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"

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;
}
运行图

计算从站A到站E的最短路径

华为机试地铁换乘C++实现(不容易啊) 描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。 地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A 阅读详情

相关推荐

C语言实现地铁乘坐最短路径

广度优先搜索会从起始站点开始,逐层遍历与当前节点相邻的节点,并记录下每个节点的距离和路径。根据设计思路,计划使用图的最短路径广度优先算法来计算地铁的最短乘坐线路。任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点.换乘站点只计算一次)。每个车站可以看作图中的一个节点,而相邻的车站之间的乘车路径可以看作是节点之间的边。可以通过读取用户输入来获取起始站点和目标站点,并调用实现的最短路径函数来计算结果。该函数应该接受起始站点和目标站点作为输入,并返回最短路径和经过的站数。

走向CTO的路上... 1138

BFS算法之地铁路线问题

问题描述 假设有两条地铁线路,1 号线为直线线路,2 号线为环线线路, 假设 1 号线的各个站点名称分别为 “A” “B” “C” “D” “E”“F” “G” "H" 2号线的各个站点名称分别为"C" “I” “J” “K” “F” “L” “M” “N”; 另外,假设地铁都是双向运行的。 现给出两个地铁站名分别作为起点和终点,请给出从起点到终点至少需要多少站。 解题思路 回顾一下题目需要我们做什么: 现给出两个地铁站名分别作为起点和终点,请给出从起点到终点至少需要多少站。 如果将地铁线路图看为一个

nepu_bin的博客 5578

地铁换乘算法

地铁换乘算法 地铁查询算法的初步实现,仅供学习研究。 版权所有dzut@qq.com,如需转载,请保留版权。 查询注意事项: 1、应该简短输入,如:“罗湖”,不要输入“罗湖站”或“罗湖地铁站”。如要扩展,可自己二次开发。 2、目前只支持最多一次的换乘查询,多线路查询支持敬请期待。 3、目前还未收集到站点间距离数据,所以暂不支持价格查询。

使用图算法实现地铁线路规划

1、概述 2、DFS方法 3、BFS方法 4、弗洛伊德算法 5、Dijkstra算法 6、总结

wh义华的专栏 5611

狄杰斯特拉算法求地铁最短路径换乘方案(上海地铁为例)

(啊啊啊大家别下载了,我的这个代码有bug的!)采用的狄杰斯特拉算法。对每一个站点创建station对象(不同线路的换乘车站算不同的站点),每个站点的相邻点为其之前站点,之后站点,和换乘站点,换乘站点之间权值为0,然后建立邻接表,用狄杰斯特拉算法从起始站开始遍历,如果遍历到的站点为终点站,停止遍历,于是得到最短路径。

地铁线路问题.-C语言实现-可连续查询任意站点

地铁线路问题.-C语言实现-可连续查询任意站点

总结自己应用广度优先搜索(BFS)中的错误(记POJ 1376 Robot结题过程)

学习BFS之后以 POJ 1376 Robot(http://poj.org/problem?id=1376)作为练习,开始以为该题难度还好,但结果错了两天。特别郁闷的是竟然一直找不出错在什么地方,因为运行网上的题解在图较小的情况下没找出区别,最后碰运气花了个把小时在改图测试数据

perry_xiao的专栏 1189

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 481

乘地铁方案的最优选择二(票价,距离)Floyd算法

上一篇文章中是以Dijkstra算法实现的查找最短路径,还可以用Floyd算法实现。 在原类中添加一个方法: public int findByFloyd(T start, T stop) { FLOYD floyd = new FLOYD(subTrainMatrix); int startPos = getPosInvertex(start); int stopPos =

shachundaiben的专栏 2275

数字电路实验避坑指南:如何正确搭建主从JK触发器测试电路(附Proteus仿真)

本文详细解析了主从JK触发器的工作原理及实验搭建指南,重点解决了常见的Catching Problem现象,并提供了Proteus仿真优化方案。通过元器件选型、电路连接步骤和常见错误排查,帮助读者正确搭建测试电路,确保数字电路实验的稳定性和可靠性。

weixin_30790841的博客 469

别再花钱买商业软件了!这4款免费DIC工具,从散斑生成到应变分析全搞定

本文介绍了4款免费开源的DIC(数字图像相关技术)工具,涵盖从散斑生成到应变分析的全流程,帮助用户零成本构建专业级DIC工作流。这些工具在精度、算法透明度和生态整合方面具有优势,适用于材料力学和实验力学研究,可替代昂贵的商业软件。

weixin_42525369的博客 168

java地铁最短距离_地铁线路最短路径

java 实现地铁线路最短路径提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。以北京地铁为例,地铁线路信息保存在data.txt中,格式如下:地铁线路总数线路名1 站名1 站名2 站名3 ...线路名2 站名1 站名2 站名3 ...线路名3 站名1 站名2 站名3 ......1.主要功能两个功能:1.计算指定两站之间最短(最少经过站数)乘车路线;2...

weixin_39621794的博客 1101

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 265

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

【实例简介】Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路。【实例截图】【核心代码】SUBWAY└── SUBWAY├── bin│ ├── Station.class│ ├── SubwayMap$10.class│ ├── SubwayMap$11.class│ ├── SubwayMap$12.class│ ├── Subw...

weixin_30135925的博客 218

视频动作识别、行为识别、时空动作检测数据集整理(持续更新)

动作、行为、事件 在计算机视觉的相关研究中,人体的动作、行为识别是一个基础研究问题。但目前识别、检测人类的动作/行为仍然是一个巨大的挑战。这里整理下当前相关的细分任务、数据集和开源代码(持续更新中)。

人工智能算法与工程实践 3万+

TypeScript的安装与使用

TypeScript的安装与使用

qq_51589308的博客 600

L3-022 地铁一日游 (30 分)-PAT 团体程序设计天梯赛 GPLT

森森喜欢坐地铁。这个假期,他终于来到了传说中的地铁之城——魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计费距离)每 K 公里增加 1 元车费。 例如取 K = 10,动安寺站离魔都绿桥站为 40 公里,则车费为 2 + 4 = 6 元。 为了获得最大的满足感,森森决定用以下的方式坐地铁:在某一站上车(不妨设为地铁站 A),则对于所有车费相同的到达站,森森只会在计费距离最远的站或线路末端站点出站,然后用森森美图 App 在站点外拍一张认证照,再按同

柳婼 の blog 1458

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 675

c++实现北京地铁线路查询系统

北京地铁线路查询系统

ZiQqing的博客 2323

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 383

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

地铁换乘C++

/* 高级题样题:地铁换乘 描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。 编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。 地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A

phoebe 5926

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

地铁换乘—华为2014校招机试样题 —Dijkstra 和 Floyd-Warshall 算法解决

地铁换乘——华为2014校招机试样题 ——方法一:Dijkstra最短路径算法   原题如下: 地铁换乘 描述: 已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。

沧海一根草的专栏 3345

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

北京地铁路线规划系统数据结构课程设计:便捷出行新选择

北京地铁路线规划系统数据结构课程设计:便捷出行新选择 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在繁华的都市生活中,地铁出行已成为人们日常通勤的重要方式。为了使北京地铁乘客能够更高效地规划出行路线,一群充满智慧的学者开发了一款名为“北京地铁路线规划系统 —— 数据结构课程设计”的开源项目。该项目利用数据结构知识,实现对北京地铁乘坐路线的智能查询,让乘客轻松找到最适...

gitblog_06758的博客 801

地铁线路项目需求简要分析

需求:   1. 实现一个命令行程序   2. 参数:     -map:来获得对应的自定义地铁文件(命名为 subway.txt),从而得到地铁线路图的信息 java subway -map subway.txt     -a:指定用户希望查询的地铁线路     -o:指定输出的文件 java subway -a 1号线 -map subway.txt -o ...

banfengtiao8904的博客 366

Android项目开发之--------地铁时光机(二,Floyd算法筛选最短路径及输出)

一、通过Floyd 算法 算出两点间最短路径并进行输出 现已知一个复杂的地铁线路图如下: 要想知道图中任意两点之间的 最短路径 可以采用Floyd算法 解决步骤如下: 1、将各个节点 存放到一个数组中(可以手动输入,当然可以从数据库中取) 1 public String[] siteName= new String[]{ 2 /*...

401

poj 2502 floyd 家-地铁站-学校

题意:给出家和学校的坐标,从家出发,沿途经过地铁站,一些地铁站是一条线上的,可以如果到地铁站的话,可以随便上车,步行和地铁的速度也给出,求家到学校的最短时间。 注意:地铁线不一定是直的,所以只要在一条地铁线并且是相邻的两站那么就建乘地铁的边,否则就步行。 思路:建图+floyd #include #include #define INF 0x7ffffff using namespace

丿聪丶 816
上一篇: BFS算法之地铁路线问题
下一篇: C++11实现高效内存池
nepu_bin
博客等级 码龄6年 513粉丝 113原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值