AC
import java.util.Arrays; import java.util.Scanner; public class J1008_2 { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n = cin.nextInt(); int m = cin.nextInt(); while (n != 0 && m != 0) { int[][] map = new int[n + 5][n + 5]; for (int i = 0; i < n + 5; i++) Arrays.fill(map[i], Integer.MAX_VALUE / 3); int[][] w = new int[n + 5][n + 5]; for (int i = 0; i < n + 5; i++) Arrays.fill(w[i], Integer.MAX_VALUE / 3); for (int i = 1; i <= m; i++) { int a = cin.nextInt(); int b = cin.nextInt(); int c = cin.nextInt(); int d = cin.nextInt(); map[a][b] = c; map[b][a] = c; w[a][b] = d; w[b][a] = d; } int s = cin.nextInt(); int t = cin.nextInt(); int[] d = new int[n + 5]; Arrays.fill(d, Integer.MAX_VALUE); int[] co = new int[n + 5]; Arrays.fill(co, Integer.MAX_VALUE); boolean[] fa = new boolean[n + 5]; Arrays.fill(fa, true); fa[s] = false; for (int i = 1; i <= n; i++) { d[i] = map[s][i]; co[i] = w[s][i]; } for (int i = 1; i < n; i++) { int min = Integer.MAX_VALUE; int k = 0; for (int j = 1; j <= n; j++) { if (fa[j] && (min > d[j] || (min == d[j] && co[k] > co[j]))) { min = d[j]; k = j; } } fa[k] = false; for (int j = 1; j <= n; j++) { if (fa[j] && (d[k] + map[k][j] < d[j] || (d[k] + map[k][j] == d[j] && co[k] + w[k][j] < co[j]))) { d[j] = d[k] + map[k][j]; co[j] = co[k] + w[k][j]; } } } System.out.println(d[t] + " " + co[t]); n = cin.nextInt(); m = cin.nextInt(); } } }
之前用了佛洛依德超时了,改成C也超时了,于是用了Dijkstra,Dijkstra和Prim很像,Dijkstra是通过节点k来更新d[j],即:d[j] = d[k] + map[k][j];
而Prim是用刚加入最小生成树的节点k到j的距离来更新节点j到原最小生成树的距离,即d[j]=map[k][j]
原文:http://blog.csdn.net/ieayoio/article/details/25832909