博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
阅读量:5374 次
发布时间:2019-06-15

本文共 1875 字,大约阅读时间需要 6 分钟。

自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :)

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,比如数据结构、图论、运筹学等。

 

首先,大家需要明确的是,Dijkstra算法是用来解决non-negative-weight的最短路程问题的

如果图中存在负权图,可以尝试使用 Bellman-Ford 暴力法或者 SPFA 算法解决

 

那么用它能来解决什么问题呢?

我之前写过如下几篇博文

  1. 多个起点,一个终点,求从起点到终点的最短路(也可以理解成可以解决多点到多点的最短路)http://www.cnblogs.com/wushuaiyi/p/3647246.html
  2. 第k短路(与A*算法有关) http://www.cnblogs.com/wushuaiyi/p/3892970.html
  3. 临接表下Dijkstra实现模板以及带heap优化http://www.cnblogs.com/wushuaiyi/p/3714674.html

 

下面来一个最容易理解的Dijkstra C++实现版本 (邻接矩阵):

1 const int  MAXINT = 32767; 2 const int MAXNUM = 10; 3 int dist[MAXNUM]; 4 int prev[MAXNUM]; 5  6 int A[MAXUNM][MAXNUM]; 7  8 void Dijkstra(int v0) 9 {10     bool S[MAXNUM];                                  // 判断是否已存入该点到S集合中11       int n=MAXNUM;12     for(int i=1; i<=n; ++i)13     {14         dist[i] = A[v0][i];15         S[i] = false;                                // 初始都未用过该点16         if(dist[i] == MAXINT)    17               prev[i] = -1;18         else 19               prev[i] = v0;20      }21      dist[v0] = 0;22      S[v0] = true;   23     for(int i=2; i<=n; i++)24     {25          int mindist = MAXINT;26          int u = v0;                               // 找出当前未使用的点j的dist[j]最小值27          for(int j=1; j<=n; ++j)28             if((!S[j]) && dist[j]
算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

 

  


 

算法实例

先给出一个无向图

下面的表格可以帮助大家理解算法

 

 

资料来源:http://cnblogs.com/wushuaiyi

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html

转载于:https://www.cnblogs.com/wushuaiyi/p/4553119.html

你可能感兴趣的文章
C语言数据类型
查看>>
关于每次取PC的值为PC+4的问题
查看>>
JavaScript笔记——函数
查看>>
89 Gray Code
查看>>
.NET中的视图和过滤器 (DefaultView和RowFilter)
查看>>
jeecg权限设置案例
查看>>
第一次学习前端总结
查看>>
C#WinForm的DataGridView控件显示行号
查看>>
递归复习,递归输出字符串的全排列
查看>>
jQuery选择器 大于 空格 波浪线 加号
查看>>
猜数字游戏dowhile循环
查看>>
NoSql之旅--Cassandra的Cql简介(二)
查看>>
解决eclipse环境下maven项目tomcat启动,未加载到项目的问题
查看>>
ASP.NET多次点击提交按钮以及Session超时和丢失过期问题
查看>>
For循环嵌套
查看>>
service xxx does not support chkconfig
查看>>
2012.5.20号学习笔记
查看>>
【代码笔记】iOS-城市plist
查看>>
【读书笔记】iOS-应用程序剖析
查看>>
树形背包模版-洛谷P1273 有线电视网
查看>>