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[][]={,,,,,,,
,,,,M,,M,
,M,,,M,,M,
,,M,,,M,M,
,M,,M,,,M,
,M,M,M,,,M,
,M,M,M,,M, };
int book[];
int dis[];
int i,j,k,u,min;
void dijsktra()
{
for(i=;i<=;i++)
{
dis[i]=a[][i];
book[i]=;
}
book[]=; //1点的初始化
for(i=;i<=;i++)
{
min=M;
for(j=;j<=;j++)
{
if(book[j]==&&dis[j]<min) //找当前最小距离
{min=dis[j];
u=j; }
}
book[u]=; for(k=;k<=;k++) //若跳板距离更短,那么选择跳板距离作为最短距离 即注1
{
if((dis[k])>(a[u][k]+dis[u])&&(a[u][k]<M)) //单独注意a[u][k],表示以u点做跳板,跳板到k的距离 巧妙利用了邻接表
dis[k]=dis[u]+a[u][k];
}
} for(i=;i<=;i++)
{
printf("%d ",dis[i]);
} } int _tmain(int argc, _TCHAR* argv[])
{
printf(" \n");
dijsktra();
system("pause");
return ;
}

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

参考资料:

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

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

Dijkstra算法的C++实现的更多相关文章

  1. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  2. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  3. 关于dijkstra算法的一点理解

    最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  6. Dijkstra算法(一)之 C语言详解

    本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...

  7. 最短路问题Dijkstra算法

    Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...

  8. dijkstra算法求最短路

    艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...

  9. 数据结构之Dijkstra算法

    基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...

  10. ACM: HDU 1869 六度分离-Dijkstra算法

    HDU 1869六度分离 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descri ...

随机推荐

  1. MySQL常用日期时间函数

    日期和时间函数: MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ③每个客户端 ...

  2. 虚拟DOM和react中的diff算法总结

    https://blog.csdn.net/qq_26708777/article/details/78107577 一.虚拟DOM 1.什么是虚拟DOM及原理        把真实DOM树,变成js ...

  3. Oracle Metric sequence load elapsed time

    Oracle Metric sequence load elapsed time The sequence load elapsed time Oracle metric is the amount ...

  4. sub2ind函数

    sub2ind函数是MATLAB中对矩阵索引号检索的函数,用法如下: >> A=rand(5) A = 0.6850    0.0867    0.2290    0.1006    0. ...

  5. 《通过C#学Proto.Actor模型》之Behaviors

    Behaviors就是Actor接收到消息后可以改变处理的方法,相同的Actor,每次调用,转到不同的Actor内方法执行,非常适合按流程进行的场景.Behaviors就通过在Actor内部实例化一个 ...

  6. System.Threading.Timer如何正确地被Dispose

    System.Threading.Timer是.NET中一个定时触发事件处理方法的类(本文后面简称Timer),它背后依靠的是.NET的线程池(ThreadPool),所以当Timer在短时间内触发了 ...

  7. java遍历复杂json字符串获取想要的数据

    https://blog.csdn.net/qq_34309663/article/details/80508125 java如何解析复杂的json数据关于json处理的包有好几个,比如jackson ...

  8. vue 使用小结 2019.03

    v-bind 中使用函数 :attr = 'num' 如上面的例子,通常 num 是 vue 实例中 data 的值,或者是 computed 对象中的值,我们可以在具体函数中计算,改变相应的变量,以 ...

  9. servlet篇 之 跳转问题

    servlet中的跳转: 跳转本质上是对文件传输操作 进行 封装. 例如:客户端访问一个servlet,在servlet中需要把已经写好的页面hello.html返回给客户端浏览器,需要用io来实现这 ...

  10. [SimplePlayer] 2. 在屏幕上显示视频图像

    我们这里采用SDL(本文所用版本为SDL2.0.5)来进行图像输出,SDL在进行图像渲染时一般采用的会是direct3D或者opengl,SDL对它们进行了封装,不过我们这里只讨论SDL的使用,并不会 ...