蒲公英 · JELLY技術週刊 Vol.28: Next.js 10 釋出
阿新 • • 發佈:2020-11-04
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