description
某国有n座城市,这些城市之间通过m条单向道路相连,已知每条道路的长度。
不过,小X只对其中k座城市感兴趣。
为了更好地规划模拟旅行路线,提升模拟旅行的体验,小X想要知道他感兴趣的城市之间两两最短路的最小值(即在他感兴趣的城市中,最近的一对的最短距离)。
作为一个肥宅,小X根本懒得写程序来解决这道问题,于是他把这个问题丢给了你。
J 国有 nn 座城市,这些城市之间通过 mm 条单向道路相连,已知每条道路的长度。
一次,居住在 J 国的 Rainbow 邀请 Vani 来作客。不过,作为一名资深的旅行者,Vani 只对 J 国的 kk 座历史悠久、自然风景独特的城市感兴趣。
为了提升旅行的体验,Vani 想要知道他感兴趣的城市之间「两两最短路」的最小值(即在他感兴趣的城市中,最近的一对的最短距离)。
也许下面的剧情你已经猜到了——Vani 这几天还要忙着去其他地方游山玩水,就请你帮他解决这个问题吧。
analysis
-
对于所有关键点开始跑最短路,原图和反图分别跑一次,记为disi,dis1idis_i,dis1_idisi,dis1i
-
记录下dijdijdij里每个点从哪一个关键点转移得来,记为fromi,from1ifrom_i,from1_ifromi,from1i
-
枚举一条边,如果边的两端点的fromx≠fromyfrom_x≠from_yfromx=fromy,此时可以拿disx+dis1y+lendis_x+dis1_y+lendisx+dis1y+len更新答案
-
因为fromx≠fromyfrom_x≠from_yfromx=fromy,所以两端点是从不同关键点走到,说明该边可能在两个关键点的最短路上
-
还有一种更妙的做法,不过SPFASPFASPFA弄不了,我还没实现
-
建立超级源向所有关键点连000边,然后从超级源跑最短路和次短路
-
关键点的最短路当然是000,次短路的意义是什么呢
-
其实某关键点的次短路一定是经过另一个关键点走到它的最短路
-
答案取次短路的最小值就可以了,感觉确实妙
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define MAXN 300005
#define MAXM 3000005
#define ha 1926081719491001
#define ll long long
#define reg register ll
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x<y)?(x):(y))
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

这篇博客探讨了如何找到一组特定城市之间的两两最短路径的最小值。作者介绍了两种方法,包括从所有关键点运行最短路径算法,以及利用超级源构建最短路和次短路的方法,以解决旅行规划中的问题。
最低0.47元/天 解锁文章
290

被折叠的 条评论
为什么被折叠?



