博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dijkstra算法的C++实现
阅读量:6295 次
发布时间:2019-06-22

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

      Dijkstra算法是在图中寻找两顶点最短路径的算法。

    下面以下图有向图为例,说明其基本思想。

      

    上图为转化为邻接矩阵存储:

    现在我要寻找1点到其他点的最短距离以及路径:

    a)1点到各点的距离分别为:  0 1 12 无穷 无穷 无穷

    b)从上述距离中寻找最小的距离,发现距离2点最近,那么选择2点作为“跳板” 

 c) 1以2作跳板后到各个点的距离分别为(即必走1->2) : 0 1 10 4 无穷 无穷

   往后的工作就是重复b) c)继续找最短的距离作为跳板,直到各个点都做过跳板为止。 那么最终这6个数字分别就是顶点1到各个点的最短距离。

    有几个问题需要注意:

    1. 步骤a)b)找到跳板后再得到c),需要改变的值只是以跳板做中间量后距离变短的值,比如说上述黄色两个部分的第三个位置,加了跳板后是10<没加跳板的12,这时候才需要改成10。假设加了跳板后的值反而比没加前变大了,那么保留原来的值。(这就是的dijkstra的“贪心算法”)。

    2. 找跳板的时候只能从没做过跳板中的元素中取。

    3.上述方法仅仅讲述了如何求得最短距离,并没有提最短路径,最短路径的实现方法将在过几天的代码中体现。

  

以下代码以图:

 

// Dijkstra.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "stdlib.h"#define M 999999 int a[7][7]={
0,0,0,0,0,0,0, 0,0,50,10,M,45,M, 0,M,0,15,M,10,M, 0,20,M,0,15,M,M, 0,M,20,M,0,30,M, 0,M,M,M,35,0,M, 0,M,M,M,3,M,0 };int book[10];int dis[10];int i,j,k,u,min;void dijsktra(){ for(i=1;i<=6;i++) { dis[i]=a[1][i]; book[i]=0; } book[1]=1; //1点的初始化 for(i=2;i<=6;i++) { min=M; for(j=2;j<=6;j++) { if(book[j]==0&&dis[j]
(a[u][k]+dis[u])&&(a[u][k]

未完待续,有路径输出的在加着注释 。

参考资料:

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

http://lobert.iteye.com/blog/2315820

 

转载于:https://www.cnblogs.com/xuhongfei0021/p/7912474.html

你可能感兴趣的文章
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>