JAVA实践Dijkstra算法求最短路径距离

前言

Dijkstra算法用于求指定顶点到其他顶点的最短距离,时间复杂度O(N^2),据说可以使用堆优化到O(log N),然而还不会。
其特点是(对我来说)非常容易求得路径,和对应的距离。
缺陷也是存在的,此算法不能处理负权边。即距离为负时,就挂了。
此文内容同样参考《啊哈,算法》

另外个人感觉代码可能有错,还望有心人指点。

功能实现

输入一个顶点

输出路径
输出与路径对应的距离
如果存在不可到达的顶点,则输出该顶点不可到达

中文版参考

演示图
对应的二维数组

     {0, 1, 12, INF, INF, INF},
     {INF, 0, 9, 3, INF, INF},
     {INF, INF, 0, INF, 5, INF},
     {INF, INF, 4, 0, 13, 15},
     {INF, INF, INF, INF, 0, 4},
     {INF, INF, INF, INF, INF, 0}
/**
 * Dijkstra算法
 *
 * 指定一个顶点,求该顶点到各个顶点的最短路径
 * Step 1:
 *      选择一个顶点,如顶点1
 *      使用布尔数组记录mark[1] = true;
 *      表示已经最短
 * Step 2:
 *      遍历各个顶点到达顶点1的长度,不能到达的为无穷大,到自己本身的为0
 *      使用与顶点个数大小相同的一维数组dis存储所有距离,此时为估计距离
 *      估计距离dis数组存储的是[顶点1],到达其他顶点的距离
 *      记录距离顶点1最近(距离最短)的顶点,即dis中最小的数,但是不能为0
 *      此处2号顶点距离顶点1最近,所以选择到达顶点2,此时顶点2已确定距离顶点1最短
 *      dis: [0 1 12 inf inf inf]
 * Step 3:
 *      选择进入顶点2
 *      表示顶点2已经最短,使用布尔数组记录mark[2] = true;
 *      遍历各个顶点到达顶点2的长度,将其与dis中的估计距离比较,小于估计距离的更新之
 *      遍历后得出
 *
 *      顶点2到顶点4的距离是3
 *      顶点2到顶点3的距离是9
 *
 *      顶点1到顶点2的距离为1
 *      顶点2到顶点3的距离为9
 *      相加起来就是顶点1到顶点4的最短距离:10
 *      比原来的小,更新估计顶点3的距离
 *      dis: [0 1 10 inf inf inf]
 *
 *      顶点2到顶点4的距离为3
 *      顶点1到顶点2的距离为1
 *      相加起来就是顶点1到顶点4的最短距离:4
 *      比原来小,更新顶点4的估计距离
 *      dis: [0 1 10 4 inf inf]
 *
 *      找出距离顶点1最近的,又未确定最短的顶点
 *      即mark[n] = false,同时数值最小的。
 *      这里mark[1]、mark[2]都是true,排除之后,数值最小的是4,选择它
 * Step 4:
 *      选择进入顶点4
 *      表示顶点4已经最短,使用布尔数组记录mark[4] = true;
 *      遍历各个顶点到达顶点4的长度,将其与dis中的估计距离比较,小于估计距离的更新之
 *      遍历后得出
 *
 *      顶点4到顶点3的距离是4
 *      顶点4到顶点5的距离是13
 *      顶点4到顶点6的距离是15
 *
 *      顶点1到顶点4的距离是4
 *      将距离相加,得到
 *      dis: [0 1 8 4 17 19]
 *      排除顶点1、2、4找最近的顶点,就是顶点3
 * Step n:
 *      重复选择距离最近的顶点
 *      进入,并标记已最短
 *      寻找新的距离,并更新估计距离
 *      排除已确定顶点,再次寻找最小数值顶点
 */

代码实现


                
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值