写文档使人头大,呜呜呜(╥╯^╰╥)
课程 | 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,那么我们便可使用迪科斯彻算法