单源最短路径!这里直接上代码我在代码写了详尽的注释,若有bug,不足望悉心指出,thanks!
import java.util.Scanner;
public class dijkstra {
// dijkstra 单源最短路径
static int n, m;
static int[][] map;
static int inf = 999999999;
static int dis[];
static int[] book;// 标记数组
static int u;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
n = sc.nextInt();// 顶点
m = 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] = inf;
}
map[i][i] = 0;
}
for (int i = 0; i < m; i++) {
int p1 = sc.nextInt();
int p2 = sc.nextInt();
map[p1][p2] = sc.nextInt();
}
// 初始化dis数组 这里是保存顶点1到其余各个顶点的距离
dis = new int[n + 1];
for (int i = 1; i <= n; i++) {
dis[i] = map[1][i];// 取1号顶点到各个顶点的距离
}
// book数组初始化
book = new int[n + 1];
book[1] = 1;
// dijkstra核心算法
/*
* 为什么是n-1 呢?
*
* 最短路径肯定是一个不包含回路的 简单路径,回路分为正权回路(回路权值之和为正)
* 和负权回路(回路权值之和为负)
* 如果最短路径中包含正权回路,那么去掉这个回路,一定可以得到更短的路径 。
* 如果路径中包含负权回路,那么肯定没有
* 最短路径,因为没多走一次负权回路,就可以得到更短的路径。
* 因此最路径肯定是一个不包含回路的简单路径,即最多包含
* n-1条路径,所以进行n-1次松弛就可以了
*
*/
for (int i = 1; i <= n - 1; i++) {
int min = inf;
for (int j = 1; j <= n; j++) {
if (book[j] == 0 && dis[j] < min) {
min = dis[j];
u = j;
}
}
book[u] = 1;
for (int v = 1; v <= n; v++) {
if (map[u][v] < inf) {
if (dis[v] > dis[u] + map[u][v]) {// dis数组表示的是1号顶点到各个顶点的最短距离,
// 1号顶点到v的距离 与通过u顶点中转后
// 到v顶点的距离做对比,
dis[v] = dis[u] + map[u][v];
}
}
}
}
for (int i = 1; i <= n; i++) {
System.out.print(dis[i] + "\t");
}
}
}
输入:
6 9
1 2 1
1 3 12
2 3 9
2 4 3
3 5 5
4 3 4
4 5 13
4 6 15
5 6 4
输出:
0 1 8 4 13 17