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