在每年的比赛里,所有进入决赛的同学都会获得一件很漂亮的 t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入格式
输入包括多组数据。
每组数据第一行是两个整数 NN、MM(N le 100N≤100,M le 10000M≤10000),NN 表示大街上有几个路口,标号为 11 的路口是商店所在地,标号为 NN 的路口是赛场所在地,MM 则表示在成都有几条路。N=M=0N=M=0 表示输入结束。接下来 MM 行,每行包括 33 个整数 AA,BB,CC(1 le A,B le N,1 le C le 10001≤A,B≤N,1≤C≤1000),表示在路口 AA 与路口 BB 之间有一条路,我们的工作人员需要 CC 分钟的时间走过这条路。
输入保证至少存在 11 条商店到赛场的路线。
输出格式
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。
样例输入
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
样例输出
3 2
import java.util.Scanner; public class Main { public static int[][] map = new int[105][105]; public static int[] visit = new int[104]; public static int n, m; public static int MAX = 0x3f3f3f3f; public static void main(String[] args) { // TODO Auto-generated method stub Scanner cin = new Scanner(System.in); n = cin.nextInt(); m = cin.nextInt(); while (n != 0 && m != 0) { for(int i = 1; i <= n; i++) { visit[i] = 0; for(int j = 1; j <= n; j++) { map[i][j] = MAX; } } for(int i = 0; i < m; i++) { int a, b, c; a = cin.nextInt(); b = cin.nextInt(); c = cin.nextInt(); if(map[a][b] > c) map[a][b] = map[b][a] = c; } System.out.println(dij(1)); n = cin.nextInt(); m = cin.nextInt(); } } public static int dij(int s) { int ans = 0; int dist[] = new int[n+1]; for(int i = 1; i <= n; i++) { dist[i] = map[s][i]; } dist[s] = 0; for(int i = 0; i < n; i++) { int min = MAX; int p = 0; for(int j = 1; j <= n; j++) { if(visit[j] == 0 && min > dist[j]) { min = dist[j]; p = j; } } if(p == 0) { break; } visit[p] = 1; // ans += min; for(int j = 1; j <= m; j++) { if(visit[j] == 0 && dist[j] > map[j][p] + min) { dist[j] = map[j][p] + min; } } } // return ans; return dist[n]; } }