地铁最短路径

1.主要功能:

  计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。
以北京地铁为例,地铁线路信息保存在data.txt中。

 

 

保存在一份文本文档中,格式为:

地铁线路总数
线路名1 站名1 站名2 站名3 ...
线路名2 站名1 站名2 站名3 ...
线路名3 站名1 站名2 站名3 ......

目标1:计算指定两站之间最短(最少经过站数)乘车路线
目标2:输出指定地铁线路的所有站点

类职责划分
1、line类 :用于保存路线名和该路线上的所有站点

public class Line {
    private String name = "";
    private ArrayList<String> stations =new  ArrayList<>();
    private int size;
    
    public String getname() {
        return name;
    }
    public void addStation(String station) {
        stations.add(station);
        size++;
    }
    public void setname(String name) {
        this.name = name;
    }
    public ArrayList<String> getStations() {
        return stations;
    }
    public int getSize() {
        return size;
    }
    
}

 

2、station类 :用于储存各个站点的具体信息

public class Station {
    
    private String name = "";
    private ArrayList<String> Line = new ArrayList<String>(); 
    private ArrayList<Station> Linkstation = new ArrayList<Station>();
    public int way;  
    public Station pre;  //存放最短路径的前驱节点

    public Station(){
        
    }
    public ArrayList<Station> getLinkstation() {
        return Linkstation;
    }
    public void addLinkstation(Station station) {
        Linkstation.add(station);
    }
    public String getname() {
        return name;
    }
    public void setname(String name) {
        name = name;
    }
    public void addLine(String line) {
        Line.add(line);
    }
    public void setLine(ArrayList<String> line) {
        Line = line;
    }
    public ArrayList<String> getLine() {
        return Line;
    }
}

 

3从文件中读取

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
                String s = null;
                int j;
                Station    prestation= new Station();
                while ((s = br.readLine()) != null) {
                    String tokens[]=s.split(" ");
                    Line line = new Line();
                    line.setname(tokens[0]);
                    for(int i=1;i<tokens.length;i++) {
                        line.addStation(tokens[i]);
                        for(j=0;j<stations.size();j++) {
                            if(stations.get(j).getname().equals(tokens[i]))
                                {
                                    stations.get(j).addLine(tokens[0]);
                                    if(i!=1) {
                                        stations.get(j).addLinkstation(prestation);
                                        prestation.addLinkstation(stations.get(j));
                                    }
                                    prestation=stations.get(j);
                                    break;
                                }
                            Station station = new Station();
                            station.addLine(tokens[0]);
                            station.setname(tokens[i]);
                        }
                        if(j==stations.size()) {
                            Station station = new Station();
                            station.addLine(tokens[0]);
                            station.setname(tokens[i]);
                            station.way=10000;
                            if(i!=1) {
                                station.addLinkstation(prestation);
                                prestation.addLinkstation(station);
                            }
                            stations.add(station);
                            prestation=station;
                        }
                    
                    }
                    lines.add(line);
                }

 

4、所有代码

public class TestClass {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        String temp="C:\\Users\\billy\\Desktop\\地铁线路信息.txt";
        File file = new File(temp);
        ArrayList<Station> stations= new ArrayList<>();
        ArrayList<Line> lines = new ArrayList<Line>();
        try{
                BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
                String s = null;
                int j;
                Station    prestation= new Station();
                while ((s = br.readLine()) != null) {
                    String tokens[]=s.split(" ");
                    Line line = new Line();
                    line.setname(tokens[0]);
                    for(int i=1;i<tokens.length;i++) {
                        line.addStation(tokens[i]);
                        for(j=0;j<stations.size();j++) {
                            if(stations.get(j).getname().equals(tokens[i]))
                                {
                                    stations.get(j).addLine(tokens[0]);
                                    if(i!=1) {
                                        stations.get(j).addLinkstation(prestation);
                                        prestation.addLinkstation(stations.get(j));
                                    }
                                    prestation=stations.get(j);
                                    break;
                                }
                            Station station = new Station();
                            station.addLine(tokens[0]);
                            station.setname(tokens[i]);
                        }
                        if(j==stations.size()) {
                            Station station = new Station();
                            station.addLine(tokens[0]);
                            station.setname(tokens[i]);
                            station.way=10000;
                            if(i!=1) {
                                station.addLinkstation(prestation);
                                prestation.addLinkstation(station);
                            }
                            stations.add(station);
                            prestation=station;
                        }
                    
                    }
                    lines.add(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        
        
        System.out.print("1.查询最短路径 \n2.查询线路站点 ");
        int number=input.nextInt();
        if(number==1){
        System.out.print("起始站:");
        String begin_station_name=input.next();
        System.out.print("终点站:");
        String end_station_name=input.next();
        Station end_station = new Station();
        Station begin_station = new Station();
        
        for(Station station:stations) {
            if(station.getname().equals(begin_station_name)) {
                begin_station=station;
                Queue<Station> queue = new LinkedList<>();
                station.way=0;
                queue.offer(station);
                while(!queue.isEmpty()) {
                    Station vertex=queue.poll();
                    for(Station linkstation:vertex.getLinkstation()) {
                        if(linkstation.way==10000) {
                            linkstation.way=vertex.way+1;
                            queue.offer(linkstation);
                            linkstation.pre=vertex;
                        }
                    }
                }
            }
            if(station.getname().equals(end_station_name))
                end_station=station;
        }
        ArrayList<Station> result=new ArrayList<>();
        result(end_station,result);

        String changeLine="";
        for(String i:result.get(0).getLine()) {
            if(result.get(1).getLine().contains(i)) {
                changeLine=i;
                break;
            }
        }
        for(int i=0;i<result.size();i++) {
            if(i>=2) {
                String line1="";
                for(String t:result.get(i).getLine()) {
                    if(result.get(i-1).getLine().contains(t)) {
                        line1=t;
                        break;
                    }
                }
                if(!line1.equals(changeLine)) {
                    for(String t:result.get(i).getLine()) {
                        if(result.get(i-1).getLine().contains(t)) {
                            changeLine=t;
                            break;
                        }
                    }
                }
            }
            System.out.println(result.get(i).getname());
        }
        }
        else if(number==2) {
            System.out.print("请输入线路名称:");
            String line_name=input.next();

            for(Line line:lines) {
                if(line.getname().equals(line_name))
                    {
                        System.out.print(line.getStations().toString());
                        break;
                    }
            }
        }
        else {
            System.out.print("输入有误");
        }
       }
    public static void result(Station sta,ArrayList<Station> temp) {
        if(sta.pre!=null)  
        result(sta.pre,temp);
        temp.add(sta);
    }
}

第一个测试样例

 

 

第二个测试样例

 

 

第三个测试样例

 

 

 

 

总结

1.第一次用博客来写记录自己写的代码,有很多不懂的地方,需要提升写代码水平。

2.对于java语言我远不如c用的熟练,还需要提升。

posted on 2020-11-05 12:45  周billy  阅读(137)  评论(0)    收藏  举报

导航