文章目录

  • 1 简介
  • 2 算法思想与原理
  • 3 具体步骤
  • 4 动态展示
  • 5 代码实现(以邻接矩阵为例)
    • 5.1 基本数据
    • 5.2 初始化
    • 5.3 dijkstra算法核心
    • 5.4 主函数与头文件等
  • 6 拓展

1 简介

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止
PS:此算法不能用于求负权图,要求所有边的权重都为非负值。


2 算法思想与原理

dijkstra算法思想是基于贪心算法思想的。所谓贪心算法即始终保持当前迭代解为当前最优解。意思就是在已知的条件下或是当前拥有的全部条件下保证最优解,若在此后的迭代中由于加入了新的条件使得产生了更优解则替代此前的最优解。通过不断的迭代不断保证每次迭代的结果都是当前最优解,那么当迭代到最后一轮时得到的就会是全局最优解。 由于下一轮迭代会参考上一轮的最优解,因此每一轮的迭代的工作量基本一致,降低了整体工作的复杂性。

在最短路径的问题中,局部最优解即当前的最短路径或者说是在当前的已知条件下起点到其余各点的最短距离。关键就在于已知条件,这也是Dijkstra算法最精妙的地方。我们来解释一下。

对于Dijkstra算法,我们假设初始集合(也就是初始条件)不存在任何顶点的,即所有顶点之间是不存在任何路径的,即我们认为所有顶点之间的距离都是无穷大。那么开始加入新的条件,因为我们已知源点距源点距离最小,所以加入进去,并加入它的边,在该条件下,更新该源点到其余顶点的最短距离,选出没有加入到已知集合的距源点距离最小的点,此点最短距离也被确定了(因为其他路径都比这条路径大,无法通过其他路径间接到达这个顶点使得路径更小),然后加入该点与其余还未加入已知条件顶点的边,并以该点迭代刷新最短距离。再重复以上操作,直至所有顶点都加入已知条件集合。


3 具体步骤

  1. 选择起点start与终点end;
  2. 所有点除起点外加入未知集合,并将起点加入已知集合,即至标志位为真,意为已确定该点到源点的最短路径;
  3. 初始化计算,更新起点与其他各点的耗费dis(start,n);
  4. 在未知集合中,选择dis(start,n)中值最小的点x,将x加入已知集合。
  5. 对于剩余顶点中,计算dis(start,n)>dis(start,x)+dis(x,n)
    若真则dis(start,n)=dis(start,x)+dis(x,n),此时start与n点路径经过x点。循环直至goal点加入已知列表,取得dis(start,goal)即为最短距离。

4 动态展示

5 代码实现(以邻接矩阵为例)

5.1 基本数据

const int inf=0x3f3f3f3f; //代表无穷大。
const int maxn=100;//最大顶点数
int n,m;//n个顶点,m条边。
bool visited[maxn];//判断是否确定到源点的最终最短距离。
int graph[maxn][maxn];//带权图
int dis[maxn];//顶点到源点的最短距离。
int start,goal;//起点与目标点。

5.2 初始化

void init(){memset(visited,false,sizeof(visited));for(int i=1;i<=n;i++){dis[i]=graph[start][i];//初始化dis数组。}
}

5.3 dijkstra算法核心

void dijkstra(){//源点为源点start。int minn;//记录每趟最短路径中最小的路径值。 int pos;//记录得到的minn所对应的下标。init();//调用初始化函数。visited[start]=true;for(int i=1;i<=n;i++){//将n个顶点依次加入判断。minn=inf;for(int j=1;j<=n;j++){if(!visited[j]&&dis[j]<minn){minn=dis[j];pos=j;}}//经过这趟for循环后我们找到的就是我们想要的点,可以确定这点到源点的最终最短距离了。visited[pos]=true;//我们将此点并入已知集合。//接下来就是更新dis数组了,也就是当前最短距离,这都是针对还没有并入已知集合的点。for(int j=1;j<=n;j++){if(!visited[j]&&dis[j]>dis[pos]+graph[pos][j])dis[j]=dis[pos]+graph[pos][j];}}//退出循环后,所有的点都已并入已知集合中,得到的dis数组也就是最终最短距离了。cout<<dis[goal]<<endl;//输出目标点到源点的最短路径长度。
}

5.4 主函数与头文件等

#include<bits/stdc++.h>using namespace std;int main()
{while(cin>>n>>m){memset(graph,inf,sizeof(graph));int u,v,w;for(int i=0;i<m;i++){cin>>u>>v>>w;
//          graph[u][v]=w;//有向图graph[u][v]=graph[v][u]=w;//无向图}cin>>start>>goal;//输入起点与终点。dijkstra();}return 0;
}

6 拓展

如果你学会了dijkstra,那恭喜你成功突破了一关。但是,没有优化的dijkstra算法时间复杂度为O(n2)O(n^2)O(n2),如果顶点很多边很少呢等等卡邻接矩阵的题,那么建议你还是要学一下dijkstra的优化版了。详情点击:Dijkstra算法优化~~你一定可以看懂的四种进阶优化

dijkstra算法详解—简单易懂相关推荐

  1. Dijkstra算法详解(完美图解、趣学算法)

    Dijkstra算法详解 Dijkstra算法设计 Dijkstra算法简介 Dijkstra算法的基本思想 Dijkstra贪心策略 完美图解 伪代码详解 完整代码 算法解析及优化拓展 使用优先队列 ...

  2. 迪杰斯特拉(Dijkstra)算法详解

    迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...

  3. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  4. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  5. 解决最短路径的Dijkstra算法详解,附加Java代码

    1. 最短路径问题 最短路径问题是生活中经常碰到的一类问题,如机器人路径规划,数学竞赛以及真实的工程施工问题:甚至是我们程序员笔试必刷算法题.其实问题很简单,就是有很多个节点,我们要计算出一个初始点到 ...

  6. 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  7. 最短路dijkstra算法详解_图论系列开始填坑--Dijkstra,单源最短路

    暑假只有最开始的几天最有意思,考完试玩了几天就感觉到了无聊.抱着想要出去走走的心态,我制定了一个出行路线图,我在1号城市,想去看一看2,3,4,5号城市(每去一个城市都从1号城市出发),一切准备就绪, ...

  8. 11.贪心算法入门-----Dijkstra算法详解

    Dijkstra算法详细(单源最短路径算法) 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算 ...

  9. dijkstra算法_最短路径算法—Dijkstra算法详解

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

最新文章

  1. 算法基础知识科普:8大搜索算法之红黑树(中)
  2. 关于bjam编译自己模块出错的问题
  3. 根据当前时间如何找到上月的第一天和最后一天?
  4. php mongodb
  5. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(9) - 64位整型指令(MMX指令集扩展)
  6. 6月8日任务(12.10 Nginx访问日志 12.11 Nginx日志切割 12.12 静态文件)
  7. 商场内自动扶梯的研究
  8. CentOS通过进程ID查询运行文件的路径方法
  9. Java算法——地图单点坐标判断是否存在于某个区域
  10. Coinbase、BlockFi相继开启上市准备工作,但SEC准备好了吗?
  11. 【存储】存储基本概念(lun,volume,HBA,DAS,NAS,SAN,iSCSI,IPSAN、存储池和存储卷)
  12. S7Comm Plus 协议研究
  13. AssertionError: View function mapping is overwriting an existing endpoint function: inner
  14. 光纤、光缆的基本知识(2)
  15. 解决“由于文件许可权错误 word无法完成保存”问题
  16. linux服务器filesystem,Linux Filesystem in Userspace(FUSE)
  17. bash install.sh ********错误
  18. sql 删除数据库表内容
  19. 牛客网 KY6 手机键盘
  20. matlab卷积相关

热门文章

  1. Anaconda环境安装skimage包
  2. ABB机器人机械手DSQC328A DSQC509 3HAC5687-1 3HAC16831-1 DSQC540 3HAC14279-1 DSQC532B 3HAC023447-1/01
  3. 剑指Offer 30.包含 min 函数的栈(Python)
  4. reference check 背景调查
  5. Dynamics CRM安装教程八:Claims-based认证-外部访问配置(IFD配置)
  6. C++声明、定义、类的定义、头文件作用、头文件重复引用
  7. Linux(CentOS7)之NFS服务器设置
  8. hibernate 一对多 取多方数据重复问题,FetchMode.JOIN、FetchMode.SELECT、FetchMode.SUBSELECT区别
  9. 仅9天拿下CVPR竞赛冠军,家里的狗狗都改了作息
  10. 基于C++的复数四则运算