题目名称 3109. [GXOI/GZOI2019]旅行者
输入输出 WAW.in/out
难度等级 ★★★☆
时间限制 4000 ms (4 s)
内存限制 512 MiB
测试数据 12
题目来源 Gravatar梦那边的美好ET 于2019-04-20加入
开放分组 全部用户
提交状态
分类标签
最短路
分享题解
通过:12, 提交:57, 通过率:21.05%
Gravatarムラサメ 100 1.887 s 33.07 MiB C++
Gravatar梦那边的美好ET 100 2.978 s 26.71 MiB C++
Gravatar小金 100 5.833 s 13.36 MiB C++
Gravatar黄天乐 100 7.338 s 20.04 MiB C++
Gravatar宇战 100 8.150 s 34.82 MiB C++
Gravatar黄天宇 100 8.172 s 39.11 MiB C++
Gravatar黄天乐 100 9.545 s 26.95 MiB C++
Gravatar00000 100 12.124 s 15.07 MiB C++
Gravatar┭┮﹏┭┮ 100 15.286 s 26.05 MiB C++
Gravatar┭┮﹏┭┮ 100 15.360 s 26.05 MiB C++
本题关联比赛
4043级NOIP2022欢乐赛6th
NOIP2023模拟赛2
关于 旅行者 的近10条评论(全部评论)
Gravatar┭┮﹏┭┮
2023-11-14 19:03 6楼
数据太弱,建议加强
数据生成器:
int T=5,n=5000,m=(n-1)*2,k=n/10,len=10;
printf("%d\n",T);
while(T--){
printf("%d%d%d\n",n,m,k);
for(int i=1;i<=k;++i){
int id=(i-1)*len+1;
if(id!=1){
printf("%d%d%d\n",1,id,1);
printf("%d%d%d\n",id,1,1);
}
for(int j=id+1;j<id+len;++j){
printf("%d%d%d\n",j-1,j,1);
printf("%d%d%d\n",j,j-1,1);
}
}
for(int i=1;i<=k;++i){
printf("%d",i*len);
}
puts("");
}
Gravatarムラサメ
2023-11-14 14:27 5楼
回复 @Skylake
是初中有一次把咱叫去听高中的课的时候讲的,当时我听完大受震撼,以至于其他题都忘了就记着这一题hh
Gravatarop_组撒头屯
2022-10-26 21:38 4楼
回复 @组撒头屯 :
不记得了欸,可能我还没听吧,这题正解反而简单一点,次解更巧妙
Gravataryrtiop
2022-10-26 21:30 3楼
回复 @Skylake :
我记得好早之前的集训讲过这题,没记错应该是不停按二进制分两组跑最短路,不过具体分法也忘了
Gravatarop_组撒头屯
2022-10-26 21:00 2楼
$\mathcal O(Tn\log n\log k)$ 的做法属实人类智慧,感觉比正解还巧妙
Gravataryrtiop
2022-10-26 20:57 1楼

3109. [GXOI/GZOI2019]旅行者

★★★☆   输入文件:WAW.in   输出文件:WAW.out   简单对比
时间限制:4 s   内存限制:512 MiB

【题目描述】

$SY$ 国有 $n$ 座城市,这些城市之间通过 $m$ 条单向道路相连,已知每条道路的长度。

一次,居住在 $SY$ 国的 $XB$ 邀请 $HS$ 来作客。不过,作为一名资深的旅行者,$HS$ 只对 $SY$ 国的 $k$ 座历史悠久、自然风景独特的城市感兴趣。

为了提升旅行的体验,$HS$ 想要知道他感兴趣的城市之间「两两最短路」的最小值(即在他感兴趣的城市中,最近的一对的最短距离)。

也许下面的剧情你已经猜到了——$HS$ 这几天还要忙着去其他地方游山玩水,就请你帮他解决这个问题吧。

【输入格式】

每个测试点包含多组数据,第一行是一个整数 $T$,表示数据组数。注意各组数据之间是互相独立的。

对于每组数据,第一行包含三个正整数 $n,m,k$,表示 $SY$ 国的 $n$ 座城市(从 $1 \sim n$ 编号),$m$ 条道路,$HS$ 感兴趣的城市的个数 $k$。

接下来 $m$ 行,每行包括 $3$ 个正整数 $x,y,z$,表示从第 $x$ 号城市到第 $y$ 号城市有一条长度为 $z$ 的单向道路。注意 $x,y$ 可能相等,一对 $x,y$ 也可能重复出现。

接下来一行包括 $k$ 个正整数,表示 $HS$ 感兴趣的城市的编号。

【输出格式】

输出文件应包含 $T$ 行,对于每组数据,输出一个整数表示 $k$ 座城市之间两两最短路的最小值。

【样例输入1】

2
6 7 3
1 5 3
2 3 5
1 4 3
5 3 2
4 6 5
4 3 7
5 6 4
1 3 6

7 7 4
5 3 10
6 2 7
1 2 6
5 4 2
4 3 4
1 7 3
7 2 4
1 2 5 3

【样例输出1】

5
6

【样例输入输出2】

点击下载样例2 

【样例1解释】

对于第一组数据,$1$ 到 $3$ 最短路为 $5$;$1$ 到 $6$ 最短路为 $7$;$3,6$ 无法到达,所以最近的两点为 $1,3$,最近的距离为 $5$。

对于第二组数据,$1$ 到 $2$ 最短路为 $6$;$5$ 到 $3$ 最短路为 $6$;其余的点均无法互相达,所以最近的两点为 $1,2$ 和 $5,3$,最近的距离为 $6$。

【数据范围与约定】