地铁线路最短路径
Posted silencedsz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了地铁线路最短路径相关的知识,希望对你有一定的参考价值。
1.问题需求
- 将地铁线路保存成一个可读入,简洁明了的文本
- 程序能正确读入这个文件,并获取地铁线路信息
- 程序能正确处理输入的命令行
- 程序能正确输出指定地铁线经过的站点
- 程序能正确输出两个站点间的最短路径(未完全实现)
- 程序要有健壮性,能通过各类性能测试
2.实现语言
java
3.实现算法
Dijkstra算法
(代码)https://github.com/SilenceBoom/TheShortestPath.git
4.类职责划分
Station.java | 储存站的信息 |
Line.java | 储存线路信息 |
TheShortestPath.java | 主程序 |
5.核心代码
public class Line { private String name;//线路名 private ArrayList<Station> stations =new ArrayList<Station>(); private int size; public Line() { } public void addStation(Station station) { stations.add(station); size++; } public void setName(String name) { this.name=name; } public String getName() { return name; } public Station getStation(int index) { return stations.get(index); } public ArrayList<Station> getLine(){ return stations; } public int getSize() { return size; } }
public class Station{ private String name;//站名 private List<String> line = new ArrayList<String>();//所在的线路 private List<Station> linkStation =new ArrayList<Station>();//前后站 public Station(){ } public Station(String name,List<String> line,List<Station> linkStation) { this.name=name; this.line=line; this.linkStation=linkStation; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void addLine(String name) { line.add(name); } public String getLineName(int index) { return line.get(index); } public List<String> getLine(){ return line; } public void setLine(String name) { line.add(name); } public List<Station> getLinkStation() { return linkStation; } public void setLinkStation(List<Station> linkStation) { this.linkStation = linkStation; } public void addLinkStation(Station station) { linkStation.add(station); } }
public class TheShortestPath { public static void main(String[] args) throws IOException{ String path="地铁线路信息.txt"; File f =new File(path); Scanner input=new Scanner(System.in); ArrayList<Line> map = new ArrayList();//所有线路及站 ArrayList<Station> all=new ArrayList();//所有站,不重复 try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF-8")); String str=null; while((str=br.readLine())!=null) { String[] st=str.split(" "); Line line=new Line(); line.setName(st[0]); for(int i=1;i<st.length;i++) { Station station=new Station(); station.addLine(st[0]); station.setName(st[i]); line.addStation(station); } map.add(line); } for(int i=0;i<map.size();i++) { for(Station j:map.get(i).getLine()) { int n=0; for(n=0;n<all.size();n++) { if((all.get(n).getName()).compareTo(j.getName())==0) { all.get(n).addLine(j.getLineName(0)); break; } } if(n>=all.size()) { all.add(j); } } } // for(int i=0;i<all.size();i++) { // System.out.println(all.get(i).getName()); // for(String n:all.get(i).getLine()) { // System.out.print(n+" "); // } // System.out.println(); // } br.close(); }catch(Exception e) { e.printStackTrace(); } System.out.print("请输入起始站:"); String start=input.next(); System.out.print("请输入终点站:"); String end=input.next(); Shortest(start,end,all,map); } public static void Shortest(String start,String end,ArrayList<Station> all,ArrayList<Line> map) { Station startStation =new Station(); Station endStation =new Station(); boolean isSame=false; String lineName=" "; int line=-1; //获取两个站的信息 for(int i=0;i<all.size();i++) { if((all.get(i).getName()).compareTo(start)==0) { startStation=all.get(i); } else if((all.get(i).getName()).compareTo(end)==0) { endStation=all.get(i); } } //判断是否从属一条线 for(String i:startStation.getLine()) { if(endStation.getLine().contains(i)) { isSame=true; lineName=i; } } if(isSame) { for(int i=0;i<map.size();i++) { if(map.get(i).getName().compareTo(lineName)==0) { line=i; } } int isOut=-1; for(Station i:map.get(line).getLine()) { if(i.getName().compareTo(start)==0||i.getName().compareTo(end)==0) { System.out.print(i.getName()+" "); isOut=-isOut; } else if(isOut==1) { System.out.print(i.getName()+" "); } } } else { List<String> sameline=new ArrayList(); } } }
6.测试用例
八宝山
西单
八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单
1号线
苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
6号线
海淀五路居 慈寿寺 花园桥 白石桥南 车公庄西 车公庄 平安里 北海北 南锣鼓巷 东四 朝阳门 东大桥 呼家楼 金台路 十里堡 青年路 褡裢坡 黄渠 常营 草房 物资学院路 通州北关 北运河西 郝家府 东夏园 潞城
7.总结
Dijkstra算法运用起来还是有点难....还需要再完善很多很多....
以上是关于地铁线路最短路径的主要内容,如果未能解决你的问题,请参考以下文章