算法导论复习——CHP25 多源最短路

问题描述        

        给定一个带权重的有向图G=(V,E),其权重函数为ω:E→R。 在图中,对所有的结点对 u,v∈V,找出从结点u到结点v的最短路径。 该问题的解以表格(二维数组)的形式给出:第u行第v列给出从结点u到结点v的最短路径权重。

约定

        1)结点编号:不失一般性,结点编号为1,2,…,|V|。

        2)成本邻接矩阵:图G用一个n╳n的邻接矩阵W=(wij)表示, 其中,

        3)允许存在权重为负值的边,但不能包含权重为负值的环路,否则无解。
        4)最短路径矩阵:算法的输出为一个n╳n的最短路径矩阵 D=(dij),其中dij表示从结点i到结点j的一条 最短路径的权重。算法结束时有dij=δ(i,j)。

        5)前驱结点矩阵: 前驱结点矩阵记为:П=(πij),其中

        利用前驱结点矩阵П可以计算出每对结点间的最短路径。 前驱结点矩阵П的第i行所诱导的子图是一棵根结点为i的最短路径树。 对于每个结点i∈V,定义图G对于结点i的前驱子图为 Gπ,i=(Vπ,i,Eπ,i),其中

        (见CHP24) 

        打印最短路的过程

动态规划做法

最短路径的最优子结构性质

        每条路径都是最短路径:考虑从结点i到结点j的一条最短路径p。假定p至多包含m条边(假定没有权重为负值的环路),且m为有限值。

         如果i=j,则p中不包含任何边,所以p的权重等于0;

        如果i ≠ j,则将路径p分解为 ,其中  p ’至多包含 m-1 条边,则p ’是从i到k的一条最短路径, 且δ(i,j)=δ(i,k)+Wkj。

递归解

        设l_{ij}^{(m)}是从结点i到结点j的至多包含m条边的任意路径中的最小权重。

        则

自底向上解 

(伪代码在给定W和L(m-1)的情况下计算L(m))

时间复杂度O(n^4)

发现这个计算过程实际上很类似于矩阵乘法(几乎完全一样),可以用矩阵快速幂优化到O(n^3lgn)

另一种DP——Floyd-Warshall算法

         算法允许图中存在负权重的边,但不能存在权重为负值的环路。

思路

        假定图G的结点集为V={1,2,…,n}。考虑其中的一个子集 {1,2,…,k},这里k是小于n的某个整数,并是其中的最大编号。 对于任意一对结点i,j∈V,定义p是从i到j、且所有中间结点均取自于集合{1,2,…,k}的最短路径。

        p是简单路径,且p的中间结点都不大于k。

        p从i 到 j,仅经过集合{1,2,…,k}中的结点,但,

  •                 不一定经过其中的每一个结点;
  •                 也可能不存在这样的路径,此时p的权重等于∞。

在从 i 到 j 之间中间结点均取自集合{1,2,…,k-1}的基础上,试图回答这样一个问题:结点k是否是路径p上的一个中间结点?

        1)如果结点k不是路径p上的中间结点,则p上的所有中间结点都属于集合{1,2,…,k-1}。  此时,从结点i到结点j的中间结点取自集合{1,2,…,k-1}的一条最短路径也是从结点i到结点j的中间结点取自集合 {1,2,…,k}的一条最短路径。

        2)如果结点k是路径p上的中间结点,则k将路径p分解为两段(如下图),最优子结构性,p1是从结点i到结点k的一条最短路径,且中间结点全部取自集合{1,2,…,k-1} 。 因为结点k不是路径p1上的中间结点,所以路径p1上的所有结点都 属于集合{1,2,…,k-1} 。 同理,p2是从结点k到结点j的一条最短路径,且中间结点全部取自集合{1,2,…,k-1}

故有状态转移方程:

         

伪代码

 时间复杂度O(n^3)

加入最短路径构建

        \pi _{ij}^{(k)}为从结点i到结点j的一条所有中间结点都取自集合 {1,2, …, k}的最短路径上j的前驱结点。

         

应用——计算传递闭包 

        定有向图G=(V,E),定义图G的传递闭包G*=(V,E*),其中 E*={(i,j):如果图G中包含一条从结点i到结点j的路径}。

        求有向图的传递闭包: 方法一:给E中每条边赋权重1,然后运行FLOYD-WARSHALL算法, 可以在Θ(n3)求出权重路径矩阵D。在D中若dij<n,则表示存在一条从结点i到结点j的路径;否则dij=∞。

        方法二:定义矩阵T ={tij},若存在一条从结点i到结点j的路径,tij=1,否则tij=0。
                        计算T:
                                对FLOYD-WARSHALL算法进行改造:用逻辑或操作(V)和
                        逻辑与操作(Λ)替换算术操作min和+,得以下计算公式:

用于稀疏图的Johnson算法

        Johnson算法:在稀疏图中求每对结点之间的最短路径权重。

        对稀疏图,Johnson算法优于Floyd-Warshall算法,时间复杂度可达O(V2lgV+VE)。

        Johnson算法使用Dijkstra算法和Bellman-Ford算法作为自己的子程序,可处理带有负权重的图。

        如果图中包含所有结点对的最短路径,Johnson算法输出一个包含所有结点对的最短路径权重矩阵;否则报告图中包含权重为负值的环路。

        重赋权重:Johnson算法使用重新赋予权重的技术求解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 基于SpringBoot的工作量统计系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

MySQL中的事务到底是怎么一回事儿

简单来说&#xff0c;事务就是要保证一组数据库操作&#xff0c;要么全部成功&#xff0c;要么全部失败。在MySQL中&#xff0c;事务支持是在引擎层实现的&#xff0c;但并不是所有的引擎都支持事务&#xff0c;如MyISAM引擎就不支持事务&#xff0c;这也是MyISAM被InnoDB取代的…

多任务并行处理相关面试题

我自己面试时被问过两次多任务并行相关的问题&#xff1a; 假设现在有10个任务&#xff0c;要求同时处理&#xff0c;并且必须所有任务全部完成才返回结果 这个面试题的难点是&#xff1a; 既然要同时处理&#xff0c;那么肯定要用多线程。怎么设计多线程同时处理任务呢&…

leetcode递归算法题总结

递归本质是找重复的子问题 本章目录 1.汉诺塔2.合并两个有序链表3.反转链表4.两两交换链表中的节点5.Pow(x,n) 1.汉诺塔 汉诺塔 //面试写法 class Solution { public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a,b…

基于Spring Cloud + Spring Boot的企业电子招标采购系统源码

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

Python等高线图的绘制(Matplotlib篇-11)

Python等高线图的绘制(Matplotlib篇-11)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

Redis(二)

1、redis的持久化 "Redis 如何将数据写入磁盘"&#xff0c;首先要明白的时候&#xff0c;我们使用的redis的数据保存在内存上的&#xff0c;也就是说&#xff0c;只要我们的电脑关机或者重启服务器&#xff0c;那么在内存中的数据就会消失&#xff0c;所以要想持久化…

(一)CarPlay集成开发之概述与环境篇

系列文章目录 第一章 CarPlay集成开发之概述与环境篇 文章目录 系列文章目录概述开发环境依赖项总结 概述 CarPlay是由苹果公司开发的一款集成在iOS系统中&#xff0c;用于运行在已完成对接该系统的汽车中控台&#xff0c;仪表盘上的车载系统&#xff0c;该系统通过USB或者WI…

【多态模板异常处理表达式】

#include <iostream> #include <vector>using namespace std;template <typename T> class SequenceList { private:vector<T> elements;public:// 获取顺序表的长度int length() const {return elements.size();}// 在指定位置插入元素void insertEle…

前端学习笔记 3:Vue 工程

前端学习笔记 3&#xff1a;Vue 工程 上一篇文章介绍了如何在单一 Html 页面中使用 Vue&#xff0c;本文介绍如何从头开始用 Vue 构建一个前端工程项目。 环境准备 Vue 框架代码的创建依赖于 Node.js&#xff0c;因此需要先安装 Node.js。 创建和启动 创建 通过以下命令可…

Python控制程控电源(USB)

文章目录 前言一、环境搭建1.软件安装2.硬件安装二、设置程控电源连接方式三、Python代码四、验证结果五、pyd文件前言 随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制…

docker如何配置阿里云镜像加速?

登录阿里云后&#xff0c;我们点击右上角的控制台&#xff0c;控制台中搜索镜像加速服务&#xff0c;然后点击帮助文档的官方镜像加速&#xff1a; 点击容器镜像服务控制台&#xff1a; 在镜像工具里面的镜像加速器中就可以看到&#xff1a; 分别执行即可&#xff1a; 之后我们…

NVMe SSD IO压力导致宕机案例解读-3

最后找到问题的根因&#xff1a; NVME硬盘&#xff08;mdts参数为10&#xff09;的max_hw_sectors_kb设置为4096KB。当进行流式DMA映射时。如果单次请求的数据量过大&#xff0c;超过了128KB&#xff0c;导致无法有效利用IOVA优化机制&#xff0c;进而引发了对iova_rbtree_loc…

Nacos配置回滚

前言 很多时候&#xff0c;我们会配置错一些属性&#xff0c;或者需要回滚某些属性&#xff0c;这时候使用Nacos的回滚功能就很方便了 配置回滚 1、在控制台中&#xff0c;选择左侧导航栏的 “配置管理”&#xff0c;进入历史版本&#xff0c;选择Group和data id&#xff0c…

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码

基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于回溯搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于回溯搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

Vue3.4更新 “Slam Dunk“发布!!!

Announcing Vue 3.4 | The Vue Point. vue3.4更新官方文档 在vue2即将结束更新的时候&#xff0c;vue3迎来了一个重要的更新。代号为“&#x1f3c0; Slam Dunk”&#xff0c;即"灌篮高手"。这个版本进行了很多显著的内部改进&#xff0c;最重要的是模版解析的底层逻…

burpsuite模块介绍之extender(扩展)

extender Burp提供了对第三方拓展插件的支持,使用户能够编写自定义插件或从插件商店中安装拓展插件。这些Burp扩展程序可以以多种方式定制Burp的行为,包括修改HTTP请求和响应、自定义UI、添加自定义扫描程序检查以及访问关键的运行时信息,如代理历史记录、目标站点地图和扫…

松松2023年工作汇报

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 今天是2024年1月3号&#xff0c;是我们新年上班的第2天。今天我们的开会内容主要是回顾2023年公司整体发展的情况&#xff1a; 1.人员方面 整个2023年是我们松松公司人员是最稳定的一年&#xff0c;招聘了2位兼职…

架构设计系列9,10

架构设计系列9&#xff1a;前端架构和后端架构的区别 前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 定位和职责 ● 前端架构主要…

三分钟入门基于Visio的流程图绘制操作

Visio是微软旗下的一款流程图及其他框图绘制工具&#xff0c;有着广泛应用&#xff0c;其高效的展示功能和便捷快速的操作也广受认可。今天&#xff0c;我们就以最基本的流程图绘制为例来一起探索一下Visio的基础功能和用法。 声明&#xff1a;这篇教程从实用角度出发&#xf…