傻子也能看懂的迪杰斯特拉算法(转)
本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。
- 将所有的顶点分为两部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q。最开始,已知最短路径的顶点集合P中只有源点一个顶点。我们这里用一个book[ i ]数组来记录哪些点在集合P中。例如对于某个顶点i,如果book[ i ]为1则表示这个顶点在集合P中,如果book[ i ]为0则表示这个顶点在集合Q中。
- 设置源点s到自己的最短路径为0即dis=0。若存在源点有能直接到达的顶点i,则把dis[ i ]设为e[s][ i ]。同时把所有其它(源点不能直接到达的)顶点的最短路径为设为∞。
- 在集合Q的所有顶点中选择一个离源点s最近的顶点u(即dis[u]最小)加入到集合P。并考察所有以点u为起点的边,对每一条边进行松弛操作。例如存在一条从u到v的边,那么可以通过将边u->v添加到尾部来拓展一条从s到v的路径,这条路径的长度是dis[u]+e[u][v]。如果这个值比目前已知的dis[v]的值要小,我们可以用新值来替代当前dis[v]中的值。
- 重复第3步,如果集合Q为空,算法结束。最终dis数组中的值就是源点到所有顶点的最短路径。
#include <stdio.h>
int main()
{int e[10][10],dis[10],book[10],i,j,n,m,t1,t2,t3,u,v,min;int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值//读入n和m,n表示顶点个数,m表示边的条数scanf("%d %d",&n,&m);//初始化for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i==j) e[i][j]=0; else e[i][j]=inf;//读入边for(i=1;i<=m;i++){scanf("%d %d %d",&t1,&t2,&t3);e[t1][t2]=t3;}//初始化dis数组,这里是1号顶点到其余各个顶点的初始路程for(i=1;i<=n;i++)dis[i]=e[1][i];//book数组初始化for(i=1;i<=n;i++)book[i]=0;book[1]=1;//Dijkstra算法核心语句for(i=1;i<=n-1;i++){//找到离1号顶点最近的顶点min=inf;for(j=1;j<=n;j++){if(book[j]==0 && dis[j]<min){min=dis[j];u=j;}}book[u]=1;for(v=1;v<=n;v++){if(e[u][v]<inf){if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v];}} }//输出最终的结果for(i=1;i<=n;i++)printf("%d ",dis[i]);getchar();getchar();return 0;
}
通过上面的代码我们可以看出,这个算法的时间复杂度是O(N*2*N)即O(N2)。其中每次找到离1号顶点最近的顶点的时间复杂度是O(N),这里我们可以用“堆”(以后再说)来优化,使得这一部分的时间复杂度降低到O(logN)。另外对于边数M少于N2的稀疏图来说(我们把M远小于N2的图称为稀疏图,而M相对较大的图称为稠密图),我们可以用邻接表(这是个神马东西?不要着急,下周再仔细讲解)来代替邻接矩阵,使得整个时间复杂度优化到O(MlogN)。请注意!在最坏的情况下M就是N2,这样的话MlogN要比N2还要大。但是大多数情况下并不会有那么多边,因此MlogN要比N2小很多。
傻子也能看懂的迪杰斯特拉算法(转)相关推荐
- c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法
小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...
- 最短路径之Dijkstra(迪杰斯特拉)算法(无向图)
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.由for循环可知,其时间 ...
- 透彻理解迪杰斯特拉算法
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,这个算法我主动学了三遍,第一主动学的时候,是看严蔚敏的<数据结构>,当时应该是学懂了,有点透彻地理解了这个算法,但是没有记录下来 ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- 迪杰斯特拉算法 两点间最短路径的选择
百度首页 登录 注册 新闻网页贴吧知道音乐图片视频地图百科文库 首页 分类 艺术 科学 自然 文化 地理 生活 社会 人物 经济 体育 历史 特色百科 历史上的今天 数字博物馆 史记·2015 城市百 ...
- 4012最长的最短路径的求解(C++,迪杰斯特拉算法,注释全,附迪杰斯特拉算法详解文章)
描述 设计一个算法,求图G中距离顶点v的最短路径长度最大的一个顶点. 输入 多组数据,每组数据m+2行.每组数据第一行为两个整数n和m,代表有n个顶点m条路.顶点编号为1到n.第二行到第m+1行每行有 ...
- 【算法导论】第24章迪杰斯特拉算法
1.问题引入 在带权有向图中求解某个源点到其余各个顶点的最短路径一般可以采用迪杰斯特拉算法(Dijkstra算法). 2.算法的主体思想: 引用:(http://hi.baidu.com/wangzi ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
最新文章
- 蓝点lilac / ContextMenuManager:win10右键菜单清理工具
- Jmeter(一)-精简测试脚本
- linux备份文件到ftp上,Linux服务器下用FTP上传下载备份文件
- android源码包下载
- varnish几个工具命令行工作情况
- [Python] L1-028. 判断素数-PAT团体程序设计天梯赛GPLT
- 常用Windows快捷键大全
- linux测试硬盘速度命令,Linux下的硬盘读写速度测试
- android播放swf文件
- html5 iphone苹果手机主屏幕 触摸滑动效果
- 怎么用计算机把浓度转换成PH,ph浓度换算(ph怎么换算OH浓度)
- 5G NR - CSI-RS学习笔记4 - 物理层资源映射
- 【安全通报】DolphinScheduler 漏洞情况说明及处理
- 漏洞复现-网康下一代防火墙 RCE
- python之购物车(详解list tupe 循环)
- CF3B Lorry
- ublox lea-6r
- EPC附着及IMS PDN建立过程
- [ STK ] AGI systems tool kit10.1.3 安装包 免费分享
- 分享3DMax—制作雪山的教程,赶快搜藏起来吧!
热门文章
- 贝叶斯分析-学习笔记(超干的干货)
- iOS应用性能调优的25个建议和技巧
- 基于Java+Swing+Mysql员工信息管理系统
- Avoid mutating a prop directly since the value will be overwritten whenever
- win11打不开菜单怎么办?win11打不开开始菜单的9种解决方法
- 蚌埠、黄石乐高授权专卖店开业;保乐力加中国积极助力2021全国理性饮酒宣传周 | 知消...
- Java-装箱和拆箱(谁动了我的变量?)
- Echarts官网展示
- writev遇到非阻塞IO
- 一道小学数学问题的编程解法