我是靠谱客的博主 复杂篮球,这篇文章主要介绍洛谷 P8312 [COCI2021-2022#4] Autobus题目题解代码实现,现在分享给大家,希望可以做个参考。

PS:如果读过题了可以跳过题目描述直接到题解部分
提交链接:洛谷 P8312 [COCI2021-2022#4] Autobus

题目

题目描述

在一个国家里有 n n n 座城市。这些城市由 m m m 条公交线路连接,其中第 i i i 条线路从城市 a i a_i ai 出发,到 b i b_i bi 停止,路程中耗时 t i t_i ti 分钟。

Ema 喜欢旅行,但她并不喜欢在公交线路之间换乘。在旅行过程中,她希望最多只需坐 k k k 个不同的公交线路。

Ema 想知道,从城市 c i c_i ci 到城市 d i d_i di 的最短旅行时间是多少(最多坐 k k k 个不同的公交线路)。

输入格式

第一行包含两个整数 n , m n,m n,m,分别表示城市的数量和公交车线路的数量。

接下来 m m m 行,第 i + 1 i+1 i+1 包含三个整数 a i , b i , t i a_i,b_i,t_i ai,bi,ti,分别表示第 i i i 条公交车线路的起点、终点和从起点到终点所需的时间。

接下来一行包含两个整数 k , q k,q k,q,最大坐的不同公交线路的个数和问题题的个数。

接下来 q q q 行,第 m + j + 3 m+j+3 m+j+3 行包含两个整数 c j , d j c_j,d_j cj,dj,表示询问从城市 c j c_j cj 到城市 d j d_j dj 的最短旅行时间。

输出格式

输出包含 q q q 行,第 i i i 行包含一个整数,表示从城市 c i c_i ci 到城市 d i d_i di 的最短旅行时间。

样例 #1

样例输入 #1

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
4 7 1 2 1 1 4 10 2 3 1 2 4 5 3 2 2 3 4 1 4 3 2 1 3 1 4 4 2 3 3

样例输出 #1

复制代码
1
2
3
4
10 -1 0

样例 #2

样例输入 #2

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
4 7 1 2 1 1 4 10 2 3 1 2 4 5 3 2 2 3 4 1 4 3 2 2 3 1 4 4 2 3 3

样例输出 #2

复制代码
1
2
3
4
6 4 0

样例 #3

样例输入 #3

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
4 7 1 2 1 1 4 10 2 3 1 2 4 5 3 2 2 3 4 1 4 3 2 3 3 1 4 4 2 3 3

样例输出 #3

复制代码
1
2
3
4
3 4 0

提示

【样例解释】

每个样例中的答案都已经标记在图中。

【数据规模与约定】

本题采用子任务捆绑测试。

  • Subtask 1(15 pts): k ≤ n ≤ 7 k ≤ n ≤ 7 kn7
  • Subtask 2(15 pts): k ≤ 3 k ≤ 3 k3
  • Subtask 3(25 pts): k ≤ n k ≤ n kn
  • Subtask 4(15 pts):没有额外限制。

对于 100 % 100% 100% 的数据, 2 ≤ n ≤ 70 , 1 ≤ m , t i ≤ 1 0 6 , 1 ≤ a i , b i , c j , d j ≤ n , 1 ≤ k ≤ 1 0 9 , 1 ≤ q ≤ n 2 2le n le 70,1le m,t_ile 10^6,1le a_i,b_i,c_j,d_jle n,1le kle10^9,1le q le n^2 2n70,1m,ti106,1ai,bi,cj,djn,1k109,1qn2

【提示与说明】

本题分值按 COCI 原题设置,满分 70 70 70

题目译自 COCI2021-2022 CONTEST #4 T2 Autobus。

题解

30pts

floyd+次数

O ( n 5 ) O(n^5) O(n5)
在floyd中循环更新的次数。

70pts

次数+floyd

O ( n 4 ) O(n^4) O(n4)
因为每次更新一定比上一次更优,所以我们先循环更新的次数再循环floyd。(注意连边的时候就是第一次更新了)

代码实现

30pts

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//洛谷 P8312 [COCI2021-2022#4] Autobus #pragma GCC optimize(3) #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int x=0x3f3f3f3f; int n,m; int u,v,t; int r[75][75][75]; int k,q; int a[75][75]; void in(int &x){ int nt; x=0; while(!isdigit(nt=getchar())); x=nt^'0'; while(isdigit(nt=getchar())){ x=(x<<3)+(x<<1)+(nt^'0'); } } void pre(){ for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ for(int l=1;l<=n;++l){ for(int o=1;o<=k;++o){ for(int p=1;p<=k-o;++p){ r[j][l][o+p]=min(r[j][l][o+p],r[j][i][o]+r[i][l][p]); if(r[j][l][o+p]<a[j][l]){ a[j][l]=r[j][l][o+p]; } } } } } } } int main(){ register int i; in(n),in(m); memset(r,x,sizeof(r)); memset(a,x,sizeof(a)); for(i=1;i<=n;++i){ a[i][i]=r[i][i][1]=0; } for(i=1;i<=m;++i){ in(u),in(v),in(t); if(u==v){ continue; } a[u][v]=r[u][v][1]=min(r[u][v][1],t); } in(k),in(q); k=min(k,n); pre(); for(i=1;i<=q;++i){ in(u),in(v); if(a[u][v]==x){ printf("-1n"); } else{ printf("%dn",a[u][v]); } } return 0; }

70pts

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//洛谷 P8312 [COCI2021-2022#4] Autobus #pragma GCC optimize(3) #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int x=0x3f3f3f3f; int n,m; int u,v,t; int r[75][75]; int k,q; int a[75][75]; int b[75][75]; void in(int &x){ int nt; x=0; while(!isdigit(nt=getchar())); x=nt^'0'; while(isdigit(nt=getchar())){ x=(x<<3)+(x<<1)+(nt^'0'); } } void pre(){ for(int o=1;o<=k-1;++o){ for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ b[i][j]=a[i][j]; } } for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ for(int l=1;l<=n;++l){ b[j][l]=min(b[j][l],a[j][i]+r[i][l]); } } } for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ a[i][j]=b[i][j]; } } } } int main(){ register int i; in(n),in(m); memset(r,x,sizeof(r)); memset(a,x,sizeof(a)); for(i=1;i<=n;++i){ a[i][i]=r[i][i]=0; } for(i=1;i<=m;++i){ in(u),in(v),in(t); if(u==v){ continue; } a[u][v]=r[u][v]=min(r[u][v],t); } in(k),in(q); k=min(k,n); pre(); for(i=1;i<=q;++i){ in(u),in(v); if(a[u][v]==x){ printf("-1n"); } else{ printf("%dn",a[u][v]); } } return 0; }

最后

以上就是复杂篮球最近收集整理的关于洛谷 P8312 [COCI2021-2022#4] Autobus题目题解代码实现的全部内容,更多相关洛谷内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部