算法设计与分析课程复习笔记11——单源最短路径
算法设计与分析课程复习笔记11——单源最短路径
单源最短路径
最短路径问题
输入:有权有向图G=(V,E)
路径p={ v 0 , v 1 , . . . , v k v_0, v_1, . . . , v_k v0,v1,...,vk}的权:
∑ i = 1 k w ( v i − 1 , v i ) \displaystyle \sum_{i=1}^kw(v_{i-1},v_i) i=1∑kw(vi−1,vi)
最短路径的权:
δ ( u , v ) = { m i n ( w ( p ) ) : u → v , i f t h e r e e x i s t a p a t h f r o m u t o v ∞ , o t h e r w i s e δ(u,v)=\left\{ \begin{aligned} min(w(p)):u → v, if there exist a path from u to v\\ \infty, otherwise\\ \end{aligned} \right. δ(u,v)={min(w(p)):u→v, if there exist a path from u to v∞, otherwise
最短路径的不同形式
- 单源最短路径
从给定的源顶点s到图中其他顶点v ∈ V的最短路径 - 单目的地最短路径
图中的顶点v ∈ V到某个给定的目的顶点t的最短路径
反向图,演变为单源最短路径问题 - 单点对最短路径问题
给定两顶点u和v ,求u到v的最短路径 - 全对点最短路径问题
图中所有点对之间的最短距离
最短路径的优化基础
给定G=(V,E)
权函数
v 1 v_1 v1到 v k v_k vk的最短路径p
p的部分路径 p i j p_{ij} pij
那么要求:p的部分路径 p i j p_{ij} pij也是最短路径
权值为负的边
负权边可能形成负权回路,如果从源顶点s能够抵达负权回路的顶点v,则有: w(s, v) = - ∞ \infty ∞
回路
最短路径可否有回路?不可以!!!
负权回路将导致:w(s, v) = - ∞ \infty ∞
正权回路显然不能加入,因为如有移除,将产生更短的路径
零权回路也不能加入,因为移除不会对最短路径的权产生任何影响
初始化算法
InitializeSingleSource(V,s)
for each v ∈ V
do d[v] ← ∞ \infty ∞
π[v] = NIL
d[s] ← 0
所有的最短路径算法都以初始化开始
缩短法
所谓对边(u, v)的缩短,即是检查能否通过顶点u,改善已有的到达v的最短路径
Relax(u,v,w)
if d[v] > d[u] + w(u,v)
then d[v] ← d[u] + w(u,v)
π[v] ← u
所有单源最短路径算法,从初始化算法开始,然后是缩短算法
算法之间的差别在于缩短算法的执行顺序和次数
Bellman-Ford算法
单源最短路径问题,允许负权值边,
返回值:如果从源顶点s没有可抵达的负权值回路,返回‘真’,其余的返回‘假’,无解
思想:遍历所有的边|V – 1|次,每次对每条边执行一次缩短运算
BellmanFord
InitializeSingleSource(V,s) Θ ( V ) Θ(V) Θ(V)
for i ← 1 to |V|-1 O ( V ) O(V) O(V)
do for each edge (u,v) ∈ E O ( E ) O(E) O(E)
do Relax(u,v,w)
for each edge (u,v) ∈ E O ( E ) O(E) O(E)
do if d[v] > d[u] + w(u,v)
then return FALSE
return TRUE
运行开销: O ( V E ) O(VE) O(VE)
最短路径特性
三角不等式
δ(s, v) ≤ δ(s, u) + w(u, v)
-上限特性
对于任何顶点v, d[v] ≥ δ(s, v)成立
一旦d[v] = δ(s, v)成立, d[v] 便不再改变
- 无通路特性
如果不存在从s到v的通路,则有d[v] = ∞ - 收敛性
如果s~u → v 是一条最短路径,在对边(u, v)进行缩短操作之前的任何时刻有d[u] = δ(s, u), 那么在对边(u, v)进行缩短操作之后的任何时刻有d[v] = δ(s, v) - 路径松弛特性
p = { v 0 , v 1 , . . . , v k v_0, v_1, . . . , v_k v0,v1,...,vk} 是从源顶点v 0 _0 0到 v k v_k vk的最短路径,如果缩短操作是按照( v 0 v_0 v0, v 1 v_1 v1), ( v 1 v_1 v1, v 2 v_2 v2), . . . , ( v k − 1 v_{k-1} vk−1, v k v_k vk)进行的,即使其中有其他缩短操作穿插,d[ v k v_k vk ] = δ(s, v k v_k vk)成立
DAG的单源最短路径
思想:
对图进行拓扑排序
依据拓扑排序对边进行缩短操作
DGA中没有负权值回路, 因此存在最短路径
DAG-SHORTEST-PATHS(G,w,s)
topologically sort the vertices of G(拓扑排序) Θ ( V + E ) Θ(V+E) Θ(V+E)
InitializeSingleSource(V,s)(初始化) Θ ( V ) Θ(V) Θ(V)
for each vertex u, taken in topologically sorted order(依据拓扑排序顶点顺序)
do for each vertex v ∈ Adj[u]
do Relax(u,v,w)
运行开销: Θ ( V + E ) Θ(V+E) Θ(V+E)
Dijkstra算法
- 单源最短路径,不存在负权值边界
- 两类顶点的集合,S:集合中顶点的最短路径已经确定,Q:V-S,极小优先队列,Q中的值是最短路径的估计
- 重复的从Q中选择具有最短估计距离的顶点进行处理
Dijikstra(G,w,s)
InitializeSingleSource(V,s)(初始化)
S ← 空集
Q ← V[G]
while Q ≠ 空集
u ← Extract-min(Q)
S ← S ∪ {u}
for each vertex v ∈ Adj[u]
do Relax(u,v,w)
参考:任课教师邱德红教授的课件
算法设计与分析课程复习笔记11——单源最短路径相关推荐
- 算法导论-上课笔记11:单源最短路径
文章目录 0 前言 0.1 最短路径的几个变体 0.2 最短路径的最优子结构 0.3 负权重的边 0.4 环路 0.5 最短路径的表示 0.6 松弛操作 0.7 最短路径和松弛操作的性质 1 Bell ...
- 算法设计与分析考前复习
算法设计与分析考前复习 qiwang的NOJ系统在考前一天崩了,强烈建议开发新OJ 另外,由于以下这些题是我上完数电实验用了下午和晚上时间写的,可能会出一些错. 分治法复习 二分查找 描述 给定一个单 ...
- 算法设计与分析课程的时间空间复杂度
算法设计与分析课程的时间空间复杂度: 总结 算法 时间复杂度 空间复杂度 说明 Hanoi $ O(2^n) $ $ O(n) $ 递归使用 会场安排问题 \(O(nlogn)\) \(O(n)\) ...
- 计算机算法课程论文设计与实现,算法设计与分析课程论文
算法设计与分析课程论文 "卓越工程师教育培养计划"(简称卓越计划)旨在培养一批创新能力强.适应经济社会发展需要的高质量工程技术人才.在南通大学计算机科学与技术学院制定的软件工程专业 ...
- 软件算法设计与分析 期中复习
软件算法设计与分析 期中复习 第四章 蛮力法 蛮力法/多项式求值 最近点对问题 蛮力法的优缺点 旅行推销商问题 背包问题 分配问题 穷举法特点 第五章 分治法 5.1 分治法的基本思想 5.2 寻找最 ...
- 算法设计与分析 课程设计之N皇后问题
题目 N皇后回溯法求解空间 目的要求 目的: 1.用学到的书本知识解决实际问题的能力: 2.锻炼实际工作所需要的动手能力: 3.加强对数据结构和算法的应用: 4.锻炼自己以科学理论和工程上能力的技术, ...
- 算法设计与分析期末复习不挂科
算法的基本概念 算法概念 通俗讲:算法是解决问题的一种方法或一个过程 严格讲:算法是解某一特定问题的一组有穷规则的集合 且满足以下性质: 有限性:算法在执行有限步之后必须终止 确定性:算法的每一个步骤 ...
- 算法设计与分析--期末复习重点总结
目录 一.算法概述 1.算法的定义与特性 2.数学证明法 3.算法复杂性分析方法 4.渐进分析 二.递归与分治策略 1.递归概念 2.递归算法设计示例 3.递归算法分析 4.分治基本思想 5.分治算法 ...
- 哈工大2019年春算法设计与分析期末复习
本文原载于我的博客,地址:https://blog.guoziyang.top/archives/22/ 第二章 算法分析的数学基础 2.1 复杂性函数的阶 阶为复杂性函数的主导项. 如函数 T ( ...
最新文章
- 《与编码人员一起工作》作者访谈
- python读取excel-Python Pandas读取修改excel操作攻略
- oracle数据库的net manager配置监听(插图)
- Impala介绍,Impala架构,Impala安装,impala Shell ,分区创建,refresh,load数据,获取数据的元数据
- 单片机设置12分频c语言,AT89C51单片机,如何实现延迟一秒
- java实现红包要多少钱_java实现红包的分配算法
- u-boot分析(八)----串口初始化
- 分支程序设计02 - 零基础入门学习C语言11
- 桌面上的Flutter:Electron又多了个对手
- w10安装ubuntu_Windows10安装ubuntu18.04双系统教程
- JDBC12 ORM01 Object[]存放一条记录
- 单片机音乐倒数计时器c语言,基于单片机音乐倒数计时器设计.doc
- 耦合矩阵 matlab,耦合矩阵变换(化简)的问题
- Linux Docker镜像上传阿里云和网络配置
- PS零基础学习教程(一)
- Java虚拟机(JVM)面试题(2022年总结最全面的面试题!!!)
- kd树 python实现_Python - KDTree 实现
- 微信小程序:小程序内用户帐号登录规范调整和优化建议
- git revert回滚merge提交时报错(commit xxx is a merge but no -m option )
- linux shell 未找到命令,未找到linux问题setenv命令(linux issue setenv command not found)