1. 程式人生 > 實用技巧 >蒲公英 · JELLY技術週刊 Vol.28: Next.js 10 釋出

蒲公英 · JELLY技術週刊 Vol.28: Next.js 10 釋出

java 實現地鐵線路最短路徑

  提供一副地鐵線路圖,計算指定兩站之間最短(最少經過站數)乘車路線;輸出指定地鐵線路的所有站點。以北京地鐵為例,地鐵線路資訊儲存在data.txt中,格式如下:

  地鐵線路總數
  線路名1 站名1 站名2 站名3 ...
  線路名2 站名1 站名2 站名3 ...
  線路名3 站名1 站名2 站名3 ......

1.主要功能

  兩個功能:1.計算指定兩站之間最短(最少經過站數)乘車路線;2.輸出指定地鐵線路的所有站點。

2.實現語言

  java

3.最短路徑實現演算法

  Floyd演算法(Floyd-Warshall algorithm)又稱為弗洛伊德演算法、插點法,
  是解決給定的加權圖中頂點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。

4.相關類功能描述

類名稱 功能
Station 站點
Line 地鐵線路
Subway 讀取檔案、輸出檔案、計算最短路徑
Main 主函式 識別命令引數執行程式

Stataion.java

private String stationName;     //站點名稱
private Set<Line>lineName;      //所屬地鐵線
private Set<Station>linkStations; //相連的地鐵站

Line.java

private List<Station>stations;   //所經過站點
Subway.java
會在核心程式碼部分詳細說明

5.核心程式碼

1.讀取檔案

檔案是每一行一條線路資訊,所以用 readLine()

  public static Set<List<String>> readMetroline(String filename) throws Exception {
    FileInputStream inputStream = new FileInputStream(filename);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    Set<List<String>>set=new HashSet<List<String>>();
    String str = null;
    while ((str = bufferedReader.readLine()) != null) {

        String[] lineInformations = str.split(" ");
        List<String>stations=new ArrayList<String>();
        for (String s : lineInformations) {
            stations.add(s);

        }
        set.add(stations);
    }
   
    inputStream.close();
    bufferedReader.close();
    return set;
}

2.查詢某一條線路,在讀取檔案階段就已經將資訊都儲存好了,直接查詢就可以。

  public static List<String> check(String linename){
    Line line=lines.get(linename);
    List<Station>stations=line.getStations();
    List<String>strings=new ArrayList<String>();
    for(Station station:stations){
        strings.add(station.getStationName());
    }
    return strings;
}

計算最短路,使用弗洛伊德演算法(核心部分)

  public static void findFloydRoad(int[][] table) {
    int size = len;
    path = new int[size][size];
    dist = new int[size][size];
    //initialize dist and path
    System.out.println(size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            path[i][j] = -1;
            dist[i][j] = table[i][j];
        }
    }
    for (int k = 0; k < size; k++) {
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                if (dist[i][k] != INF &&
                        dist[k][j] != INF &&
                        dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    path[i][j] = k;
                }
            }
        }
    }

}

6.測試用例

1.通過 -map 引數獲得地鐵的

2.查詢五號線站點 -a 5號線 -map C://subway.txt -o -line.txt

3.查詢最短路徑 -b 出發站點 目的站點 -map C://subway.txt -o line.txt


7.總結