题目链接:点这里

[CSP-S 2022] 假期计划

题目背景

由于众所周知的原因,官方数据现置于子任务 0,剩余的子任务为民间数据。

题目描述

小熊的地图上有 n n n 个点,其中编号为 1 1 1 的是它的家、编号为 2 , 3 , … , n 2, 3, \ldots, n 2,3,…,n 的都是景点。部分点对之间有双向直达的公交线路。如果点 x x x 与 z 1 z_1 z1​、 z 1 z_1 z1​ 与 z 2 z_2 z2​、……、 z k − 1 z_{k - 1} zk−1​ 与 z k z_k zk​、 z k z_k zk​ 与 y y y 之间均有直达的线路,那么我们称 x x x 与 y y y 之间的行程可转车 k k k 次通达;特别地,如果点 x x x 与 y y y 之间有直达的线路,则称可转车 0 0 0 次通达。

很快就要放假了,小熊计划从家出发去 4 4 4 个不同的景点游玩,完成 5 5 5 段行程后回家:家 → \to → 景点 A → \to → 景点 B → \to → 景点 C → \to → 景点 D → \to → 家且每段行程最多转车 k k k 次。转车时经过的点没有任何限制,既可以是家、也可以是景点,还可以重复经过相同的点。例如,在景点 A → \to → 景点 B 的这段行程中,转车时经过的点可以是家、也可以是景点 C,还可以是景点 D → \to → 家这段行程转车时经过的点。

假设每个景点都有一个分数,请帮小熊规划一个行程,使得小熊访问的四个不同景点的分数之和最大。

输入格式

第一行包含三个正整数 n , m , k n, m, k n,m,k,分别表示地图上点的个数、双向直达的点对数量、每段行程最多的转车次数。

第二行包含 n − 1 n - 1 n−1 个正整数,分别表示编号为 2 , 3 , … , n 2, 3, \ldots, n 2,3,…,n 的景点的分数。

接下来 m m m 行,每行包含两个正整数 x , y x, y x,y,表示点 x x x 和 y y y 之间有道路直接相连,保证 1 ≤ x , y ≤ n 1 \le x, y \le n 1≤x,y≤n,且没有重边,自环。

输出格式

输出一个正整数,表示小熊经过的 4 4 4 个不同景点的分数之和的最大值。

样例 #1

样例输入 #1

8 8 1
9 7 1 8 2 3 6
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 1

样例输出 #1

27

样例 #2

样例输入 #2

7 9 0
1 1 1 2 3 4
1 2
2 3
3 4
1 5
1 6
1 7
5 4
6 4
7 4

样例输出 #2

7

提示

【样例解释 #1】

当计划的行程为 1 → 2 → 3 → 5 → 7 → 1 1 \to 2 \to 3 \to 5 \to 7 \to 1 1→2→3→5→7→1 时, 4 4 4 个景点的分数之和为 9 + 7 + 8 + 3 = 27 9 + 7 + 8 + 3 = 27 9+7+8+3=27,可以证明其为最大值。

行程 1 → 3 → 5 → 7 → 8 → 1 1 \to 3 \to 5 \to 7 \to 8 \to 1 1→3→5→7→8→1 的景点分数之和为 24 24 24、行程 1 → 3 → 2 → 8 → 7 → 1 1 \to 3 \to 2 \to 8 \to 7 \to 1 1→3→2→8→7→1 的景点分数之和为 25 25 25。它们都符合要求,但分数之和不是最大的。

行程 1 → 2 → 3 → 5 → 8 → 1 1 \to 2 \to 3 \to 5 \to 8 \to 1 1→2→3→5→8→1 的景点分数之和为 30 30 30,但其中 5 → 8 5 \to 8 5→8 至少需要转车 2 2 2 次,因此不符合最多转车 k = 1 k = 1 k=1 次的要求。

行程 1 → 2 → 3 → 2 → 3 → 1 1 \to 2 \to 3 \to 2 \to 3 \to 1 1→2→3→2→3→1 的景点分数之和为 32 32 32,但游玩的并非 4 4 4 个不同的景点,因此也不符合要求。

【样例 #3】

见附件中的 holiday/holiday3.inholiday/holiday3.ans

【数据范围】

对于所有数据,保证 5 ≤ n ≤ 2500 5 \le n \le 2500 5≤n≤2500, 1 ≤ m ≤ 10000 1 \le m \le 10000 1≤m≤10000, 0 ≤ k ≤ 100 0 \le k \le 100 0≤k≤100,所有景点的分数 1 ≤ s i ≤ 10 18 1 \le s_i \le {10}^{18} 1≤si​≤1018。保证至少存在一组符合要求的行程。

测试点编号 n ≤ n \le n≤ m ≤ m \le m≤ k ≤ k \le k≤
1 ∼ 3 1 \sim 3 1∼3 10 10 10 20 20 20 0 0 0
4 ∼ 5 4 \sim 5 4∼5 10 10 10 20 20 20 5 5 5
6 ∼ 8 6 \sim 8 6∼8 20 20 20 50 50 50 100 100 100
9 ∼ 11 9 \sim 11 9∼11 300 300 300 1000 1000 1000 0 0 0
12 ∼ 14 12 \sim 14 12∼14 300 300 300 1000 1000 1000 100 100 100
15 ∼ 17 15 \sim 17 15∼17 2500 2500 2500 10000 10000 10000 0 0 0
18 ∼ 20 18 \sim 20 18∼20 2500 2500 2500 10000 10000 10000 100 100 100

考场思路

当时看到这道题时,满脑子都是 O( n 3 {n}^{3} n3)的传递闭包,于是喜提70分凎的真蚌

正解

其实这道题可以用O( n {n} n)的时间复杂度找到任意一点走k个边能到达的点,然后O( n 2 {n}^{2} n2)预处理一下所有点,因为1点是确定的废话,而1点相邻的有A点和D点,所以可以在上面预处理时确定这个点能到达的最大权值的点……
然鹅注意细节 “从家出发去 4 4 4 个不同的景点游玩”,所以有可能出现你找到的最大权值点是相同的情况,于是要找最大权值,次大权值,第三大权值,然后就完事了

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){int x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0'; ch = getchar();}return x * f;
}
int n, m, k;
const int maxn = 2510;
vector<int> e[maxn];
int a[maxn], d[maxn][maxn];
int b[maxn][3];
void bfs(int s){for(int i = 1;i <= n;i++)d[s][i] = -1;queue<int> que;que.push(s);d[s][s] = 0;while(!que.empty()){int u = que.front(); que.pop();if(d[s][u] == k)continue;for(int i = 0, len = e[u].size();i < len;i++){int v = e[u][i];if(d[s][v] == -1){d[s][v] = d[s][u] + 1;que.push(v);}}}
}
signed main(){n = read(); m = read(); k = read() + 1;for(int i = 2;i <= n;i++)a[i] = read();for(int i = 1;i <= m;i++){int u = read(), v = read();e[u].push_back(v); e[v].push_back(u);}bfs(1);for(int i = 2;i <= n;i++){bfs(i);for(int j = 2;j <= n;j++){if(i == j)continue;if(d[i][j] == -1 || d[1][j] == -1)continue;if(a[j] > a[b[i][0]]){b[i][2] = b[i][1];b[i][1] = b[i][0];b[i][0] = j;}else if(a[j] > a[b[i][1]]){b[i][2] = b[i][1];b[i][1] = j;}else if(a[j] > a[b[i][2]]){b[i][2] = j;}}}int ans = 0;for(int i = 2;i <= n;i++){for(int j = i + 1;j <= n;j++){if(d[i][j] == -1)continue;for(int k1 = 0;k1 < 3;k1++){for(int k2 = 0;k2 < 3;k2++){int x = b[i][k1], y = b[j][k2];if(x == 0 || y == 0 || x == y || x == i || x == j || y == i || y == j)continue;ans = max(ans,a[i] + a[j] + a[x] + a[y]);}}}}printf("%lld\n",ans);return 0;
}

CSP-S2022T1题解相关推荐

  1. CSP化学方程式题解

    CSP化学方程式题解 题目描述 题目分析 本题主要考察栈的应用(也可以采用递归的方式,效率低),是一道与编译原理相关的题目. 首先我采用的是类似于哈希表的方法存储的元素位置及其数量,当然也可以用stl ...

  2. CSP 202203 题解:未初始化警告,出行计划,计算资源调度器,通信系统管理,博弈论与石子合并

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page CCF 官方题解请点击这里. 阅读本题解前,您应当了解下列知识: ...

  3. CSP认证题解第一题

    文章目录 202012-1 期末预测之安全指数 202009-1 称检测点查询 202006-1 线性分类器 201912-1 报数 201909-1 小明种苹果 201903-1 小中大 20181 ...

  4. CSP 202206 题解:归一化处理,寻宝大冒险,角色授权,光线追踪,PS无限版

    试题内容请前往CCF官网查看: CCF-CSP计算机软件能力认证考试 http://118.190.20.162/home.page 阅读本题解前,您应当了解下列知识: 线段树 教程 C++ 标准库( ...

  5. 控制for each循环次数_CCF CSP编程题解201312-1:出现次数最多的数

    试题编号:201312-1 试题名称:出现次数最多的数 时间限制:1.0s 内存限制:256.0MB 问题描述: 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. ...

  6. CCF CSP 历年题解(C/C++)【截至2019年】

    本人水平有限  目前只能做前两题  后面的随机可能会有  就脸厚的先写一个吧 (捂脸) 第一题 一般都是小模拟题  细心一点 注意一下格式之类的很容易就出来的 第二题 就是一道大模拟题 耐心一点 适当 ...

  7. 2019年3月CCF CSP 认证题解第一题

    第一题:201903-1 [题目背景] 在数据分析中,最小值最大值以及中位数是常用的统计信息. [题目描述] 老师给了你n个整数组成的测量数据,保证有序(可能为升序或降序),可能存在重复的数据.请统计 ...

  8. CSP认证题解第二题

    文章目录 202012-2 期末预测之最佳阈值 202009-2 风险人群 201909-2 小明种苹果(续) 201903-2 二十四点 201812-2 小明放学 201809-2 买菜 2018 ...

  9. 2022年9月CSP认证题解 如此编码(k进制),何以包邮?(背包问题),吉祥物投票(珂朵莉树、懒标记、并查集)

    T1 如此编码 思路 由公式 和前缀乘积定义 得m=b1+a1×b2+⋅⋅⋅+a1×a2×⋅⋅⋅×an−1×bnm=b_1+a_1\times b_2+···+a_1\times a_2\times· ...

  10. CCF CSP认证 题解:201703-3 Markdown(Java语言原创)

    问题描述 Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档.例如以下这段文本就是用 Markdown 的语法写成的: ...

最新文章

  1. Python数据库字段拆分数据
  2. HTML游戏黑屏,网页游戏黑屏:游戏进不去解决方案
  3. 使用SDL打造游戏世界之入门篇 - 4
  4. java 类似结构体_Java中如何实现类似C++结构体的二级排序
  5. Python any 函数 - Python零基础入门教程
  6. 嵌入式视频处理基础(一)
  7. DRF基类APIView的子类GenericAPIView
  8. CSRmesh Application
  9. SQL开发技巧(二)
  10. JAVA计算机毕业设计网上零食进销存(附源码、数据库)
  11. IMC IMV SecurityCenter连通
  12. 计算机vb期末试题及答案,VB期末考试试题及答案
  13. 不想更新计算机怎么办,联想笔记本电脑不想更新系统更新怎么办啊
  14. css3d转换_使用CSS 3D转换创建网页电影摄影
  15. GIS案例学习笔记-多边形内部缓冲区地理模型
  16. js之延迟执行及循环执行
  17. 基于elementUI封装了基础表单组件
  18. C语言中的void 和void 指针类型
  19. 共享 满城尽带黄金甲 在线免费观看网址
  20. 从删库到跑路or恢复,记一次MySQL数据库文件损坏恢复经历

热门文章

  1. 【OpenMMLab实践】01MMSegmentation官方教程实现过程记录(mmcv,mmsegmentation,torch)
  2. 深度测试oppo软件,OPPO手机推深度测试:可解锁Bootloader,已支持Find X正式版
  3. python改文件名方法,python改文件名的方法
  4. iOS 常用的rgb颜色表-精华版
  5. K210学习笔记(八)——人脸检测和人脸识别
  6. 左程云算法 day8 前缀树和贪心算法
  7. 思考未来--马云说:30年后的世界不属于互联网公司
  8. Linux永久修改主机名和IP
  9. 随机森林预测财务报表是否舞弊
  10. #SORA#etcd研究