java代码实现Dijkstra算法求图的最短路径

Posted 九死九歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java代码实现Dijkstra算法求图的最短路径相关的知识,希望对你有一定的参考价值。

  首先对于Dijkstra算法是什么,我就不在这里展开讲了,有前人讲过。这个:最短路径问题—Dijkstra算法详解,我个人觉得是csdn社区里面讲的最详实,最好理解的。但可惜他的代码实现是c++,java人落泪。这篇文章讲的很好,我也就不对Dijkstra算法进行过多的解释,直接上java代码好了。要看看这个,废话不多少,上代码:

import java.util.HashSet;
import java.util.Set;

public class Dijkstra {

	private static final int INF = Integer.MAX_VALUE - 10000000;

	static int[] func(int[][] matrix) {

		if (matrix[0].length != matrix.length) throw new IllegalArgumentException("对接矩阵不是方阵");
		int[] dis = matrix[0];
		Set<Integer> set = new HashSet<>();

		while (set.size() != matrix.length) {

			/* 通过for循环得到 min & minIndex */
			int min = INF;
			int minIndex = 0;

			for (int i = 0; i < matrix.length; i++) {

				if (dis[i] < 0) throw new IllegalArgumentException("对接矩阵中存在负数");

				if (((!set.contains(i)) && (dis[i] != 0) && (dis[i] <= min))) {
					min = dis[i];
					minIndex = i;
				}

			}

			/* 进行松弛操作 */
			if (!set.add(minIndex)) throw new IllegalArgumentException();
			int[] arr = matrix[minIndex];

			for (int i = 0; i < matrix.length; i++) {

				if (arr[i] < 0) throw new IllegalArgumentException("对接矩阵中存在负数");

				if (arr[i] != INF && arr[i] != 0) {
					if ((dis[minIndex] + arr[i]) < dis[i]) dis[i] = dis[minIndex] + arr[i];
				}

			}

		}

		return dis;

	}

	public static void main(String[] args) {

		int[][] m1 = new int[][]{
				{0, INF, 10, INF, 30, 100},
				{INF, 0, 5, INF, INF, INF},
				{INF, INF, 0, 50, INF, INF},
				{INF, INF, INF, 0, INF, 10},
				{INF, INF, INF, 20, 0, 60},
				{INF, INF, INF, INF, INF, 0}
		};

		int[][] m2 = new int[][]{
				{0,1,12,INF,INF,INF},
				{INF,0,9,3,INF,INF},
				{INF,INF,0,INF,5,INF},
				{4,0,13,15,INF,INF},
				{INF,INF,INF,INF,0,4},
				{INF,INF,INF,INF,INF,0}
		};

		int[] arr1 = func(m1);

		for (int num : arr1) {
			if (num == INF) System.out.print("inf");
			else System.out.print(num);
			System.out.print(" ");
		}

		int[] arr2 = func(m2);

		for (int num : arr2) {
			if (num == INF) System.out.print("inf");
			else System.out.print(num);
			System.out.print(" ");
		}

	}

}

以上是关于java代码实现Dijkstra算法求图的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

参赛博文 | 求图的最短路径---四种算法优化

Floyd是咋求图的最短路径?

[Python] 弗洛伊德(Floyd)算法求图的直径并记录路径

求图的最短路径 c语言

弗洛伊德(Floyd)算法求图的最短路径

用Dijkstra算法求最短路径的MATLAB程序