最短路径问题实现思路
把从一个顶点v0到到途中其余任意一点v1路径上所有边权值之和定义为该路径带权路径长度,带权路径长度最短的那条路径称作最短路径。
求解最短路径的算法通常依赖于一种性质,两点之间的最短路径也包含了路径上其它顶点的最短路径。
带权有向图最短路径问题分为两类:
1、单源最短路径
2、每一对顶点间的最短路径
Dijkstra算法求单源最短路径问题
求带权有向图某个源点到其余各顶点的最短路径,常用Dijkstra算法。
先以一个例子理清算法执行过程,再看概念
dist[i]表示源点到顶点i的当前最短路径长度,初始值为0
arcs[i][j]表示有向边<i,j>的权值,不存在记为∞
1、首先将源点顶点1加入集合S
2、计算出源点到S外其他顶点的路径长度,
顶点1-顶点2:dist[2]=10
顶点1-顶点5:dist[5]=5
顶点1-顶点3:dist[3]=∞
顶点1-顶点4:dist[4]=∞ (到此算是初始化)
源点-顶点5当前路径长度最短,故将顶点5加入S
3、修改从源点1到S外顶点2、3、4可达的最短路径长度,即
因为dist[5]+arcs[5][2]<dist[2],则dist[2]=dist[5]+arcs[5][2]=8
因为dist[5]+arcs[5][3]<dist[3],则dist[3]=dist[5]+arcs[5][3]=14
因为dist[5]+arcs[5][4]<dist[4],则dist[4]=dist[5]+arcs[5][4]=7
源点-顶点4当前路径长度最短,故将顶点4加入S
4、修改从源点1到S外顶点2、3可达的最短路径长度,即
因为dist[5]+arcs[5][2]<dist[2],则dist[2]=dist[5]+arcs[5][2]=8
因为dist[4]+arcs[4][2]>=dist[2],则dist[2]保持
因为dist[5]+arcs[5][3]>=dist[3],则dist[3]保持
因为dist[4]+arcs[4][3]<dist[3],则dist[3]=dist[4]+arcs[4][3]=13
源点-顶点2当前路径长度最短,故将顶点2加入S
4、修改从源点1到S外顶点3可达的最短路径长度,即
因为dist[5]+arcs[5][3]>=dist[3],则dist[3]保持
因为dist[4]+arcs[4][3]>=dist[3],则dist[3]保持
因为dist[2]+arcs[2][3]<dist[3],则dist[3]=dist[2]+arcs[2][3]=9
总结Dijkstra算法步骤
dist[i]表示源点到顶点i的当前最短路径长度,初始值为0
arcs[i][j]表示有向边<i,j>的权值,不存在记为∞
用集合S存储以求得最短路径的顶点,s[vi]=1表示将顶点i放入S中
path[i]表示从源点到所求顶点i最短路径,顶点i的前驱结点。算法结束之后,可根据此值追溯到从源点到所求结点的最短路径经过的顶点(这里不做说明)
实现思路:
1、初始化,集合S初始值为0,dist[]初始值dist[j]=arcs[0][j],如上例中的初始化
2、循环执行以下两步直到所有的点都包含:
1)从集合外的顶点中找出一个顶点vi,vi满足dist[i]最小,并将顶点i加入集合S中
2)修改从源点到S外所有顶点k的dist[vk]的值,修改规则如下:如若dist[i]+arcs[i][k]<dist[k],则dist[k]=dist[i]+arcs[i][k],dist[i]是已加入集合的顶点的最短路径长度,dist[k]是S外所有顶点中某一个顶点的当前最短路径长度
边上带有负权值,此算法不适用
Floyd算法求各顶点之间最短路径问题
实现思路:实例加概念
拥有n个顶点的图,产生1个n阶方阵序列A0以及不停的迭代产生的A1、A2…An,
用Ak[i][j]表示从顶点vi到顶点vj的路径长度,从vi到vj之间经过的顶点序号数没有大于k的,其中的k表示加入顶点k作为中间顶点,加入规则如下:如果得到的路径比原来的路径长度减少,则新路径代替原来的路径
A0、A1…A(n-1)保存了任意一对顶点当前的最短路径长度,An保存了任意一对顶点最终的最短路径长度
上图的邻接矩阵也就是 A0
A0的基础上vi-vj中间经过顶点1的路径长度即A1
A1的基础上vi-vj中间经过顶点2的路径长度即A2
A2的基础上vi-vj中间经过顶点3的路径长度即A3
此算法允许带负权值的边,但不允许包含有负权值的边组成的回路
最短路径问题实现思路相关推荐
- 7-2 单源最短路径 (10 分)(思路+详解+邻接表做法)Come Brather!!!!!!!!!!
一:前言 本次题解先展示用邻接矩阵做的,但其会出现内存超限,因为确实是临界矩阵在数据很大的时候相比临界表是耗内存的,但是以前习惯用临界矩阵了,所以一上来就用临界矩阵做了,后来上网查了后知道邻接矩阵会内 ...
- 【C语言】街区最短路径问题解题思路
描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相等. 用(x,y)来表示住户坐在的街区. 例如(4,20),表示用户在东西方向第4个街道 ...
- NYoj_07_街区最短路径问题 解题思路和代码
题目: 描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间隔相等. 用(x,y)来表示住户坐在的街区. 例如(4,20),表示用户在东西方向第4 ...
- 6. 最短路径:一通百通的秘密,动态规划设计思路
6. 最短路径:一通百通的秘密,动态规划设计思路 动态规划设计思路 Dijkstra:慢速版 DP + BFS.快速版 DP + BFS + 贪心 Bellman-Ford:DP + 穷举 Floyd ...
- 图论3之图的最短路径算法
上一篇我们讨论了图的遍历,实际问题中图的深度遍历是我们更常用的,除了图的遍历,我们一般遇到的问题更多是关于图的路径的问题.本篇将介绍图的四种常用遍历算法 一.深度或广度优先搜索算法(解决单源最短路径) ...
- 【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 119期】
⛄一.简介 路径规划是实现移动机器人自主导航的关键技术,是指在有障碍物的环境中,按照一定的评价标准(如距离.时间.能耗等),寻找到一条从起始点到目标点的无碰撞路径,这里选取最短距离路径规划的评价标准, ...
- postgis+geoserver最短路径
postgis+geoserver最短路径 1 安装软件 2 数据预处理 3 操作postgres 4 操作Geoserver 5 计算最短路径 6 问题记录 1 安装软件 安装PostgreSQL与 ...
- 最短路径:Dijikstra算法/Floyd算法
目录 1.基础 2.单源最短路径--Dijikstra算法 3.所有顶点间的最短路径--Floyd算法 1.基础 2.单源最短路径--Dijikstra算法 思路 void ShortestPath_ ...
- 弗洛伊德算法(求最短路径)
弗洛伊德算法(求最短路径) 在一个加权图中,如果想找到各个顶点之间的最短路径,可以考虑使用弗洛伊德算法. 弗洛伊德算法既适用于无向加权图,也适用于有向加权图.使用弗洛伊德算法查找最短路径时,只允许环路 ...
最新文章
- 老师与学生打赌,谁会赢?
- Windows7 UAC
- 导入CSS的三种方式
- qcustomplot删除一条曲线_微凉秋日的成熟风穿搭,选一条V领连衣裙搭配,优雅知性显身材...
- DL之BN-Inception:BN-Inception算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- Debug Docker: Error response from daemon: dial unix docker.raw.sock: connect: connection refused
- Linux centos查看cpu信息命令
- 关于低分辨率像素游戏下显示非防锯齿中文 / 汉字的研究
- Windows平台下搭建Git服务器
- error: #error regenerate this file with a newer version of protoc.
- 拓端tecdat|R语言实现LASSO回归——自己编写LASSO回归算法
- 74cms搭建 2021.03.13
- python使用requests库爬取淘宝食品信息,包含sign参数破解
- Xilinx SRIO_gen2关于时钟的问题
- 哥吃的不是饭,是农药~~!是化肥~~!是激素~!!
- 2021-3-22科研进展
- 理解数据库中候选码,主码,外码,主属性,非主属性!
- 五十 烤肉之后 我在软件园的那些日子里
- 简单网页设计静态成品分享
- 计算机java是什么意思