Dijkstra算法的C++实现
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++实现的更多相关文章
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 关于dijkstra算法的一点理解
最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- Dijkstra算法(二)之 C++详解
本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...
- Dijkstra算法(一)之 C语言详解
本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...
- 最短路问题Dijkstra算法
Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...
- dijkstra算法求最短路
艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...
- 数据结构之Dijkstra算法
基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...
- ACM: HDU 1869 六度分离-Dijkstra算法
HDU 1869六度分离 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
随机推荐
- 【Linux基础】判断当前机器是虚拟机还是物理机
1.使用dmidecode命令查看(root权限) DMI (Desktop Management Interface, DMI)的主要组成部分是Management InformationForma ...
- org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.hp.entity.Emp
错误提示代码: org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.hp.entit ...
- Java并发-AQS及各种Lock锁的原理
原文 : https://blog.csdn.net/zhangdong2012/article/details/79983404
- linux sort排序及取前几条数据
查看sort --help -n 根据字符串的数值进行比较 -k 根据某一个关键字的位置或者类型排序 -r 倒序排序 -t 字段分隔,后面跟分隔符 查看head --help -n 打印前几行记录,后 ...
- python之zip打包
import zipfile # 压缩 z = zipfile.ZipFile('z.zip', 'w') z.write('xo.xml') z.write('xxxoo.xml') z.close ...
- Linux内存管理 (26)内存相关工具
1. vmstat 参照<Linux CPU占用率监控工具小结-vmstat> 2. memstat memstat可以通过sudo apt install memstat安装,安装包括两 ...
- MySQL备份恢复-mysqldump原理
+++++++++++++++++++++++++++++++++++++++++++标题:mysqldump对MySQL数据库备份恢复原理时间:2019年2月23日内容:mysqldump工具重点: ...
- 想要开发自己的PHP框架需要那些知识储备?
作者:安正超链接:https://www.zhihu.com/question/26635323/answer/33812516来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- Tomcat服务器下载、安装、配置环境变量教程(超详细)
请先配置安装好Java的环境,若没有安装,请参照我以下的步骤进行安装! 请先配置安装好Java的环境,若没有安装,请参照我以下的步骤进行安装! 请先配置安装好Java的环境,若没有安装,请参照我以下上 ...
- 利用zabbix api添加、删除、禁用主机
python环境配置yum -y install python-pip安装argparse模块pip install -i https://pypi.douban.com/simple/ argpar ...