
数据结构与算法——图最短路径
发布日期:2021-05-19 23:03:43
浏览次数:23
分类:精选文章
本文共 1823 字,大约阅读时间需要 6 分钟。
最短路径问题是图论研究中的一个经典算法问题。针对图的最短路径问题,人们提出了多种经典算法。以下是对几种主要算法的总结与分析。
1. 引言
最短路径问题在实际生活中的路径规划、地图导航等领域有重要的应用。在图论中,求解图的最短路径问题始终是研究的热点。
2. 重要概念
图的路径:在有向图中,从任一顶点开始,由边或弧的邻接至关系构成的有限长顶点序列称为路径。
路径长度:路径中边或弧的数目。简单路径:除第一个和最后一个顶点外,路径中无其它重复出现的顶点,称为简单路径。回路或环:路径中的第一个顶点和最后一个顶点相同时,称为回路或环。图的最短路径:从有向图中某一顶点(称为源点)到达另一顶点(称为终点)的路径,使得沿此路径上各边上的权值总和达到最小。3. 深度或广度优先搜索算法
3.1 算法概述
从起点开始,同时访问所有深度遍历路径或广度优先路径,到达终点节点的路径有多条,取其中路径权值最短的一条则为最短路径。3.2 算法流程
(1)选择单源的起点作为遍历的起始点。(2)采用深度优先搜索或者广度优先搜索的方式遍历图,在遍历同时记录可以到达终点的路径。(3)在所有路径中选择距离最短的路径。3.3 实例图解
以图3.3.1所示的有向图为例,选取A为源点,D为终点,采用遍历的方式获取最短路径。4. 迪杰斯特拉(Dijkstra)算法
4.1 算法概述
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,要求图中不存在负权边。其基本思想是从源点出发,每次选择离源点最近的一个顶点前进,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。4.2 算法流程
(1)将所有的顶点分为两部分:已知最短路程的顶点集合P和未知最短路径的顶点集合Q。(2)设置源点s到自己的最短路径为0,若存在源点有能直接到达的顶点i,则把dist[i]设为e[s][i]。其他顶点的最短路径设为无穷大。(3)在Q中选择一个离源点s最近的顶点u,加入到P中,并考察所有以点u为起点的边,对每一条边进行松弛操作。(4)重复上述步骤,直到集合Q为空,算法结束。5. Bellman-Ford算法
5.1 算法概述
Bellman-Ford算法是从Dijkstra算法演变而来的,可以处理带有负权边的最短路径问题。其核心思想是对所有边进行n-1次松弛操作。如果图中存在负权环路,则算法无法找到最短路径。5.2 算法流程
(1)从源点到任意一点u的最短路径长度,初始化数组dist[u]为0,其余dist[i]为无穷大。(2)以下操作循环执行至多n-1次:对每一条边(u, v),如果dist[u] + weight(u, v) < dist[v],则令dist[v] = dist[u] + weight(u, v)。(3)检测图中是否存在负权环路:若存在,则图中无法求出单源最短路径;否则,数组dist[n]中记录的就是源点s到各顶点的最短路径长度。6. SPFA算法
6.1 算法概述
SPFA(Shortest Path Faster Algorithm)算法是Bellman-Ford算法的队列优化版本,降低了算法复杂度。6.2 算法流程
(1)初始化:选取顶点u为源点,令dist[u]=0,其余赋值为INF,并将源点入队列。(2)读取队列头的顶点,并将头顶点u出队列,将与u邻接的所有顶点v进行松弛,若v没有在队列中,则将邻接顶点v入队列。(3)队列为空时,单源最短路径查找完毕。7. Floyd算法
7.1 算法概述
Floyd算法是一个经典的动态规划算法,其基本思想是:从任意顶点u到任意顶点v的最短路径不外乎2种可能,一是直接从u到v,二是从u经过若干个顶点k到v。7.2 算法流程
(1)初始化:所有顶点之间的距离初始化为边的权重或无穷大。(2)对于每对顶点(u, v),检查是否存在一个顶点k,使得dist(u, k) + dist(k, v) < dist(u, v),如果存在,则更新dist(u, v)。(3)重复上述步骤,直到没有更多的距离更新。8. 总结
最短路径问题的解决涉及多种算法,每种算法适用于不同的场景。Dijkstra算法和Bellman-Ford算法用于解决单源最短路径问题,而Floyd算法适用于多源最短路径问题。选择哪种算法取决于具体的应用需求和图的密集度。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月10日 20时16分37秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
echarts 基本图表开发小结
2019-03-11
adb通过USB或wifi连接手机
2019-03-11
JDK9-15新特性
2019-03-11
TreeSet、TreeMap
2019-03-11
JVM内存模型
2019-03-11
可变长度参数
2019-03-11
3、条件查询
2019-03-11
cordova打包apk更改图标
2019-03-11
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2019-03-11
文件系统的层次结构
2019-03-11
vue(渐进式前端框架)
2019-03-11
vscode设置eslint保存文件时自动修复eslint错误
2019-03-11
Remove Extra one 维护前缀最大最小值
2019-03-11
Linux操作系统的安装与使用
2019-03-12
C++ 继承 详解
2019-03-12
OSPF多区域
2019-03-12
Docker入门之-镜像(二)
2019-03-12
去了解拉绳位移编码器的影响因素
2019-03-12
无法初始化Winsock2.2处理
2019-03-12
vMotion 操作失败进度卡在14% ,报错: Operation Timed out
2019-03-12