Dijkstra算法自主透析学习——基于最短路径求解问题

前言

最近根据一些习题,有了一些算法学习的方向,还没有学精,但通过不断的巩固和发现问题,也许能更好地让自己掌握其中的一些技巧。

我这一次针对最近学的Dijkstra算法作讲解,这也是数据结构中有关于图论的一部分,我力求从一个非常通俗易懂的方式(也就是大白话,口语化)来阐述,既方便于自己后续复习,也方便阅读的读者能够更快明白我的想法,如存在问题,欢迎指出。

 算法描述

Dijkstra算法,其实就是一个求单源路径最短的算法,所谓的单源,就是起点只有一个。这个算法的时间复杂度为O(n2)。

算法过程

设起点为s,用数组dis[v]来表示从s到v的最短路径长度。

第一步

就是对数组进行初始化,也就是dis[v]=∞ dis[s]=0,这里可能有点蒙,我用一个表格来帮助理解

第二步

进入循环。

(1)要在没有访问过的节点中找到一个顶点u使dis[u]是最小的,才能保证最短路径。

(2)将顶点u标记为白点(也就是使用过,后续的白点均表示使用过,蓝点则表示未使用过)

(3)将顶点u标记为白点后,对u进行相关操作,这里需要进入一个for循环,对所有与u相连的,未确定最短路径的点进行判断,并作路径的更新。

相关代码为:

if(dis[u]+w[u][v] < dis[v]){
   dis[v]=dis[u]+w[u][v]; 
}
第三步

到这里其实算法就已经结束了。

我自己看到这里的时候,也还是有点蒙,但是可以通过手写一些步骤来进一步了解学习。

全过程的演示
题目

假设问题为要找出从1号节点出发到各个节点的最短路径长度,并输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值