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

相关文章

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1