前言
最近根据一些习题,有了一些算法学习的方向,还没有学精,但通过不断的巩固和发现问题,也许能更好地让自己掌握其中的一些技巧。
我这一次针对最近学的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号节点出发到各个节点的最短路径长度,并输出。