地铁最短路径
一、主要功能
根据一幅地铁路线图,计算指定两站之间最短(最少经过站数)乘车路线;并输出指定地铁线路的所有站点。

以北京地铁为例,地铁线路信息保存在data.txt中,格式如下:
地铁线路总数
线路名1 站名1 站名2 站名3 ...
线路名2 站名1 站名2 站名3 ...
txt文档输入举例:
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 积水潭 鼓楼大街 安定门 雍和宫 东直门 东四十条 朝阳门 建国门 北京站 崇文门 前门 和平门 宣武门 长椿街 复兴门 阜成门 车公庄 西直门
二、实现语言
java
三、实现算法
BFS算法
四、代码实现
1、Station
package subway;
import java.util.ArrayList;
public class Station {
private String StationName;/*记录站点名*/
private int dist;
private Station PreStation;/*前驱结点*/
private ArrayList<String> Station = new ArrayList<String>();/*该站点的所有线路信息*/
private ArrayList<Station> NearStation = new ArrayList<Station>();/*该站点的所有邻近站点信息*/
2、Line
package subway;
import java.util.ArrayList;
public class Line {
String LineName;/*记录当前线路名*/
ArrayList<String> Station = new ArrayList<>();/*记录该线路中所有的站点名*/
}
3、文件读取
public static void read() {
File file =new File("E:\\地铁线路信息.txt");
BufferedReader reader=null;
reader=new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));//读取文件内容
String op=reader.readLine();
while(op!=null) {
String[] s=(op.split(" "));
Line line=new Line();
line.setLineName(s[0]);
for(int i=1;i<s.length;i++) {
line.addStation(s[i]);
int j;
for(j=0;j<stations.size();j++) {
if(stations.get(j).getStationName().equals(s[i])) {
stations.get(j).addStation(line.getLineName());
if(i!=1) {
stations.get(j).addNearStation(lastStation);
lastStation.addNearStation(stations.get(j));
}
lastStation=stations.get(j);
break;
}
}
if(j==stations.size()) {//车站不存在
Station station=new Station();
station.addStation(s[0]);
station.setStationName(s[i]);
station.setDist(MaxValue);
if(i!=1) {
station.addNearStation(lastStation);
lastStation.addNearStation(station);
}
stations.add(station);
lastStation=station;
}
}
lines.add(line);
}
}
4、BFS算法部分
public static void BFS(Station station) {
Queue<Station> queStation=new LinkedList<>();
station.dist=0;
queStation.offer(station);
while(!queStation.isEmpty()) {
Station s=queStation.poll();
for(int i=0;i<s.getNearStation().size();i++) {
if(s.getNearStation().get(i).getDist()==MaxValue) {
s.getNearStation().get(i).setDist(s.getDist()+1);
queStation.offer(s.getNearStation().get(i));
s.getNearStation().get(i).setPreStation(s);
}
}
}
}
五、测试用例
1:同一线路起始站测试

2:换线起始站测试

3:不存在的起始站测试

4:起始站相同测试

5:查找正常线路

6:查找不存在线路

7:输入12之外数据

六、总结
这次的作业本来使用Dijkstra(迪杰斯特拉算法)来实现的,后来改用BFS算法,主要是因为BFS代码简单,使用递归操作完成查询,
BFS算法的弊端在于只能输出一个最短路径,而Dijkstra可以解决这个问题。
但是我觉得这次的作业的难点在于数据的读取和输出,而不是算法的难易,这次作业也复习了一些数据结构的知识以及在探索过程中学习了关于hashmap的相关知识,还是有很大收获的。

浙公网安备 33010602011771号