shuoj-小6爱夜跑--Floyd记录多个最短路径

2023-12-22 17:32

本文主要是介绍shuoj-小6爱夜跑--Floyd记录多个最短路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

自从小6学了最短路算法之后,就成了一个不折不扣的最短路理论拥护者,每次在校园里夜跑的时候,只要确定好起点和终点他就能快速算出最短的路径。然而小6却没有走过每一条路,只是对这些路径长度做了一个粗略估计,于是每条路就有了估计值与实际值的差距。小6想要知道从起点到终点,按照其中任意一条预估的最短路径跑,实际最长可能需要走过的路程。(因为同一长度的最短路可能有多个)

Input

多组输入,第一行是一个整数T,表示输入数据的组数(T≤20)。

接下来有T组数据,每组数据的第一行是四个整数N、M、S、E,分别代表图中的顶点数、边数、起点编号和终点编号。

(2N100, 1M1000, 1S,TN, ST)

之后的M行每行有四个整数u, v, a, b,代表图中编号为u的点到编号为v的点有一条双向边。

每条边有两个值a、b分别代表这条边的估计长度与实际长度。

(1u,vN, 1a,b1000, u ≠ v)

数据保证两个顶点间至多只有一条双向边相连,起点与终点间必定存在通路。

Output

对于每组输入,输出一行两个整数并换行,表示小6估算出的最短路长度以及实际最长可能需要走过的路程,两个整数间有一个空格。

Sample Input

22 1 1 21 2 3 43 3 1 31 2 2 31 3 3 42 3 1 2

Sample Output

3 43 5


题意::有一个图,图有两层,通过第一层的数据求所有的最短路。然后用第二层的权值计算第一层求得的最短路的最大权值。
刚开始看这道题就想到了记录路径的方式,但是究竟如何把多个路径记录下来呢?这里的确遇到了问题。在这里给出了用Floyd记录多重路径的 方法。


题解::

1)假设c【A】【B】数组中存放A,B两点的最短路,我们知道如果在c【A】【B】 == c【A】【C】+c【C】【B】,那么(A->C->B)也是一条最短路。所以我们可以用二维的vector记录中间节点C,既path【A】【B】.push_back(C)。

2)Floyd算法更新节点是在c【A】【B】 > c【A】【C】+c【C】【B】的时候。同样的如果满足该条件,那么path【A】【B】中存放的都将不是最短路,要进行clear()操作。

3)我们知道如果从A点到B点有N种最短路径,B点到C点有M种最短路径,那么从A经过B到C共有N*M种最短路径。(计算最短路有多少条)。

当把最短路都记录下来后还有一个问题,如何根据最短路求题中要求的最长路。

1)如果path【A】【B】为 空,那最长路肯定是d【A】【B】
2)如果path【A】【B】不为空,
        1)假如有一条最短路A->C->B就分别求A C之间最长路,和B C之间的最长路。分别放入d【A】【C】,d【C】【B】。
2)比较d【A】【B】与d【A】【C】+d【C】【B】的大小。既d【A】【B】 = d【A】【B】>d【A】【C】+d【C】【B】? d【A】【B】:d【A】【C】+d【C】 【B】(C可能有多个。)
(用递归实现)


思路在经过细分析后也不是很难,哈哈哈。
代码如下:


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
vector<ll> path[120][120];ll c[120][120];
ll d[120][120];
ll max_load(int x,int y){if(path[x][y].empty())return d[x][y];for(int i = 0;i<path[x][y].size();i++){ll ans = path[x][y][i];return max(d[x][y],max_load(ans,y)+max_load(x,ans));}
}
int main(){int T;cin>>T;while(T--){for(int i = 0;i<120;i++)for(int j = 0;j<120;j++)path[i][j].clear();int m,n,s,e;cin>>n>>m>>s>>e;int u,v,a,b;for(int i = 0;i<n;i++)for(int j = 0;j<n;j++)c[i][j] = 2000;for(int i = 0;i<n;i++)c[i][i] = 0;for(int i = 0;i<m;i++){cin>>u>>v>>a>>b;u--;v--;c[u][v] = a;c[v][u] = a;d[u][v] = b;d[v][u] = b;}for (int k =0 ; k< n; k++){for (int i = 0; i< n; i++){for (int j = 0; j< n; j++)if (c[i][j] > c[i][k] + c[k][j]){c[i][j] = c[i][k]+c[k][j];path[i][j].clear();path[i][j].push_back(k);}else if (c[i][j] == c[i][k] + c[k][j] && k!= i &&k !=j)path[i][j].push_back(k);}}cout<<c[s-1][e-1]<<" ";cout<<max_load(s-1,e-1)<<endl;}return 0;
}
谢谢!











这篇关于shuoj-小6爱夜跑--Floyd记录多个最短路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524836

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事