简易地铁路线规划程序
作者:互联网
写文档使人头大,呜呜呜(╥╯^╰╥)
项目信息
课程 | https://edu.cnblogs.com/campus/gdgy/cse2021 |
---|---|
作业要求 | https://edu.cnblogs.com/campus/gdgy/cse2021/homework/12288 |
作业目标 | 掌握广度优先搜索,可达矩阵,迪科斯彻算法等 |
GitHub | https://github.com/Wulalalala0-0/MetroRoute |
实现过程
本程序 pojo
类:
// 用于存储地铁线路
public class MetroLine {
// 地铁线路名
private String name;
// 该线路经过的所有地铁站
private final List<MetroStation> stations;
}
// 用于存储地铁站
public class MetroStation {
// 地铁站名
private String name;
// 该地铁站包含的所有线路
private final List<MetroLine> lines;
}
// 用于存储中途搜索产生的数据
public class ResultCache {
// 起始站点
private MetroStation startStation;
// 终点站
private MetroStation endStation;
// 换乘位置
private final Map<Integer, MetroLine> transfer;
// 距离(一个站距离为1,替换为时间权重会规划更加准确)
private int distance;
// 经过的所有站
private final List<MetroStation> allPassedStations;
}
我们首先需要预处理文本,本程序将文本中的地铁站存储至 RouteSource.stationMap
,地铁线路存储至 RouteSource.lineMap
,其键为该站的名字或线路名,值为 pojo
类,存储时由于使用的是引用类型,故可直接将站点和线路关联起来,在遍历时补充完整
在站点间距离恒为1的情况下我们使用广度优先搜索算法(也可以说是贪心算法的演变)进行遍历,得到的结果存于 RouteService.shortestRoute
,最后将最先遍历到终点的 ResultCache
输出
算法分析
本程序有超多前辈的算法可借鉴,现在多用矩阵运算(图的思想),需要的数据就是站点间的关联及经纬度数据,可抓包获得,使用此方法可简化运算量
但由于作者懒得写就用了人尽皆知的广度优先搜索算法(由于确定站点间的距离为1,即便使用循环单步遍历,整体看还是符合广度优先搜索算法的主要思想),具体内容可以在各大网站学习,这里就不再赘述了,如果站点间距离不全为1,那么我们便可使用迪科斯彻算法
测试截图
标签:线路,存储,地铁站,程序,private,站点,简易,铁路线,final 来源: https://www.cnblogs.com/imsisi/p/15354595.html