北京地铁线路

提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。以北京地铁为例,地铁线路信息保存在data.txt中,格式如下:
地铁线路总数
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
线路名2 站名1 站名2 站名3 ...
线路名3 站名1 站名2 站名3 ......
.......
1、功能需求:
#输入出发站和终点站计算出地铁最短路径
#列出所有途径站点
2、实现语言:java
3、实现算法:采用BFS算法,解决无向图的最短路径问题
此外,引进两个集合S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。
初始时,S中只有起点Start;U中是除Start之外的顶点,并且U中顶点的路径是"起点Start到该顶点的路径"。
然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。 然后,再从U中找出路径最短的顶点,并将其加入到S中 ... 重复该操作,直到遍历完所有顶点。
4、类职责划分
查询
public class BFS
获取txt站点信息
public class init
遍历
public class Graph
5、核心代码
查询站点
public class BFS { public void bfs(int s,int t,Graph graph) { if(s<0||t<0) { return; } if(s==t) { System.out.println("两站点相同"); return; } int v=graph.getV(); LinkedList<Integer>[] adj=graph.getAdj(); boolean[] visited = new boolean[v]; visited[s] = true; Queue<Integer> queue = new LinkedList<>(); queue.add(s); int[] prev = new int[v]; for(int i=0; i<v;i++) { prev[i] = -1; } while(queue.size() != 0) { int w =queue.poll(); for(int i=0; i<adj[w].size();++i) { int q = adj[w].get(i); while(!visited[q]) { prev[q] = w; if(q == t) { print(prev,s,t); return; } visited[q] = true; queue.add(q); } } } }
遍历图
publicint v;
public LinkedList<Integer> adj[]; public Graph(int v){ this.v = v; adj = new LinkedList[v]; for(int i=0; i<v; ++i) { adj[i] = new LinkedList<>(); } } public void addEdge(int s,int t) { adj[s].add(t); adj[t].add(s); }获取地铁信息
public static void init() { try { File file = new File("C:\\Users\\lch\\Desktop\\地铁线路信息.txt"); InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); BufferedReader br = new BufferedReader(reader); String line = ""; line = br.readLine(); while (line != null) { station_name.add(line); line = br.readLine(); } } catch (Exception e) { e.printStackTrace(); } try { File file = new File("C:\\Users\\lqz\\Desktop\\站点信息.txt"); InputStreamReader reader = new InputStreamReader(new FileInputStream(file)); BufferedReader br = new BufferedReader(reader); String line = ""; line = br.readLine(); while (line != null) { String[] sArray=line.split("\\|"); lstation_name.add(sArray[0]); lline_name.add(sArray[1]); lstation_num.add(sArray[2]); switch(sArray[1]) { case "1":line1.add(sArray[0]);break; case "2":line2.add(sArray[0]);break; case "4":line4.add(sArray[0]);break; case "大兴":lineDaxing.add(sArray[0]);break; case "5":line5.add(sArray[0]);break; case "6":line6.add(sArray[0]);break; case "7":line7.add(sArray[0]);break; case "8北":line8bei.add(sArray[0]);break; case "8南":line8nan.add(sArray[0]);break; case "9":line9.add(sArray[0]);break; case "10":line10.add(sArray[0]);break; case "13":line13.add(sArray[0]);break; case "14西":line14xi.add(sArray[0]);break; case "14东":line14dong.add(sArray[0]);break; case "15":line15.add(sArray[0]);break; case "16":line16.add(sArray[0]);break; case "八通":lineBatong.add(sArray[0]);break; case "房山":lineFangshan.add(sArray[0]);break; case "昌平":lineChangping.add(sArray[0]);break; case "亦庄":lineYizhuang.add(sArray[0]);break; case "燕房":lineYanfang.add(sArray[0]);break; case "S1":lineS1.add(sArray[0]);break; case "西郊":lineXijiao.add(sArray[0]);break; case "首都机场":lineShoudujichang.add(sArray[0]);break; } line = br.readLine(); }
6、测试用例
searchstation("苹果园");
苹果园
1号线 6号线
searchstation("222");
222
站点不存在
2.查询路线
searchline("大兴");
大兴号线: 公益西桥, 新宫, 西红门, 高米店北, 高米店南, 枣园, 清源路, 黄村西大街, 黄村火车站, 义和庄, 生物医药基地, 天宫院
searchline("111");
111号线: 这段线路不存在
3.查询路径
new BFS().bfs(search("六里桥"),search("光熙门"),graph);
六里桥->六里桥东->北京西站->军事博物馆->白堆子->白石桥南(换乘6号线)->车公庄西->车公庄(换乘2号线)->西直门->积水潭->鼓楼大街->安定门->雍和宫->东直门(换乘13号线)->柳芳->光熙门
new BFS().bfs(search("苹果园"),search("苹果园"),graph);
站点一样不显示路径
new BFS().bfs(search("杭州东"),search("杭州西湖"),graph);
站点不存在
7、总结
迪杰斯特拉算法不熟悉,用的是bfs,参考了数据结构书上的图遍历
https://github.com/linchenghao/beijing.git
publicint v; public LinkedList<Integer> adj[]; public Graph(int v){ this.v = v; adj = new LinkedList[v]; for(int i=0; i<v; ++i) { adj[i] = new LinkedList<>(); } } public void addEdge(int s,int t) { adj[s].add(t); adj[t].add(s); }
浙公网安备 33010602011771号