Floyd最短路径算法

 

代码:

核心思想:a[i][j] = a[i][k] + a[k][j]

import java.util.Scanner;

public class Main {
	int [][]ans = new int[101][101];
	int nCrossRoads,mRoads;
	void readNCrossRoadsAndMRoadsAndInit(int nCrossRoads,int mRoads){
		this.nCrossRoads = nCrossRoads;
		this.mRoads = mRoads;
		for (int crossRoadsA = 1;crossRoadsA <= nCrossRoads;crossRoadsA ++) {    
			for (int crossRoadsB = 1;crossRoadsB <= nCrossRoads;crossRoadsB ++) {
				ans[crossRoadsA][crossRoadsB] = -1;
			}
			ans[crossRoadsA][crossRoadsA] = 0;  
		} 
	}
	void initPerRoads(int crossRoadsA , int crossRoadsB , int costTime){
		ans[crossRoadsA][crossRoadsB] = ans[crossRoadsB][crossRoadsA] = costTime; 
	}
	int floyd(){
		for (int passedCrossRoads = 1;passedCrossRoads <= nCrossRoads;passedCrossRoads ++) {   
			for (int crossRoadsA = 1;crossRoadsA <= nCrossRoads;crossRoadsA ++) {     
				for (int crossRoadsB = 1;crossRoadsB <= nCrossRoads;crossRoadsB ++) {
					if (ans[crossRoadsA][passedCrossRoads] == -1 || ans[passedCrossRoads][crossRoadsB] == -1) continue;
					if ( ans[crossRoadsA][crossRoadsB] == -1 || ans[crossRoadsA][passedCrossRoads] + ans[passedCrossRoads][crossRoadsB] < ans[crossRoadsA][crossRoadsB])       
						ans[crossRoadsA][crossRoadsB] = ans[crossRoadsA][passedCrossRoads] + ans[passedCrossRoads][crossRoadsB]; 
				} 
			}
		}
		return ans[1][nCrossRoads];
	}
	public static void main(String args[]){
		Main f = new Main();
		Scanner in = new Scanner(System.in);
		int nCrossRoads,mRoads;

		while (true) { 
			nCrossRoads = in.nextInt();
			mRoads =  in.nextInt();
			if(nCrossRoads == 0 && mRoads == 0)	break;
			f.readNCrossRoadsAndMRoadsAndInit(nCrossRoads, mRoads);
			while(f.mRoads-- > 0){
				int crossRoadsA , crossRoadsB , costTime; 
				crossRoadsA = in.nextInt();
				crossRoadsB = in.nextInt();
				costTime = in.nextInt();
				f.initPerRoads(crossRoadsA, crossRoadsB, costTime);
			} 
			int result = f.floyd();
			System.out.println(result);
		}
		in.close();
	}
}

  

posted @ 2017-08-02 18:14  知我者,足以  阅读(267)  评论(0编辑  收藏  举报