1.概述
(1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止
2. 迪杰斯特拉(Dijkstra)算法 与 弗洛伊德(Floyd)算法 的区别
(1)迪杰斯特拉(Dijkstra)算法:选定图中某一个顶点作为出发顶点,求出出发顶点到其他顶点的最短路径
(2) 弗洛伊德(Floyd)算法:图中的每一个顶点都是出发顶点,需要求出每一个被看成为出发顶点的顶点到其他顶点的最短路径
3.迪杰斯特拉(Dijkstra)算法的基本思路
(1)设置 int[] distance 记录出发点到图中各个顶点的距离,int[] preArray 记录图中各个顶点的前驱顶点,boolean[] visited 记录某个顶点是否已经被访问,LinkedList<String> linkedList 模拟队列,记录顶点的访问顺序(广度优先搜索思想 的体现),int[][] edgeArray 记录图中顶点之间的距离
(2)设置 i 为出发点,k 为由 广度优先搜索 得到的顶点,作为连接 i 与 j 的中间顶点,j 为其他顶点,如果存在 distance[k] + edgeArray[k][j] < distance[j] ,则更新 distance[j] ,即 distance[j] = distance[k] + edgeArray[k][j] ,代表 k 作为中间顶点时,出发点 i 到顶点 j 的最短距离为 distance[j] = distance[k] + edgeArray[k][j] ,这个最短距离是实时更新的,有可能通过其他中间顶点 k 得到更小的 distance[j] ,直到算法执行完毕,才会得到出发点到其他顶点的最短距离,如果 distance[k] + edgeArray[k][j] >= distance[j] , 则不做任何操作
4.代码实现
package com.zzb.algorithm.dijkstra;
import java.io.Serializable;
import java.util.LinkedList;
/**
* @Auther: Administrator
* @Date: 2020/3/28 13:20
* @Description: 迪杰斯特拉算法 应用之 最短路径问题
* 使用 图的广度优先搜索 解决问题
*/
public class Dijkstra {
public static void