图论最短路径算法-Dijkstra算法-单源最短路径-JAVA语言描述

单源最短路径!这里直接上代码我在代码写了详尽的注释,若有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	



你可能感兴趣的:(数据结构与算法)