floyd算法求解地铁路线问题

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

nepu_bin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值