
代码:
核心思想: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();
}
}