题目链接:http://poj.org/problem?id=2387
package D0801;
import java.util.*;
public class PKU2387 {
static int n, m;
static int[][] map;// 邻接矩阵
static int[] dist;// s到终点的最短路径
public static void dijkstra(int s) {
boolean[] p = new boolean[n + 1];// 记录改点是否属于集合a或b
// 初始化
for (int i = 1; i <= n; i++) {
p[i] = false;
if (i != s) {
dist[i] = map[s][i];
}
}
dist[s] = 0;// 原点到自己的距离为0;
p[s] = true;
// 循环n-1次,求s点到其它点的最短路径
for (int i = 1; i < n; i++) {
int min = Integer.MAX_VALUE;// s到某个点的最短路径
int k = -1;
// 在集合b中寻找从s到其路径最短的的点k
for (int j = 1; j <= n; j++) {
if (!p[j] && dist[j] < min) {
min = dist[j];
k = j;
}
}
if (k == -1)
return;// 已经找完了,没有点可以扩展
p[k] = true;// 将点k加入集合a
// 更新s到集合b中的点的路劲长度
for (int j = 1; j <= n; j++) {
if (!p[j] && map[k][j] != Integer.MAX_VALUE
&& dist[j] > dist[k] + map[k][j])
dist[j] = dist[k] + map[k][j];
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
m = sc.nextInt();
n = sc.nextInt();
// 初始化
map = new int[n + 1][n + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
map[i][j] = Integer.MAX_VALUE;
}
dist = new int[n + 1];
while(m-->0) {
int u = sc.nextInt();
int v = sc.nextInt();
int w = sc.nextInt();
map[u][v] = map[v][u] = Math.min(w, map[u][v]);
}
dijkstra(n);
// for(int i = 1;i<=n;i++)
System.out.println(dist[1]);
}
}
}