[CSP-J 2019] 加工零件题解
[CSP-J 2019] 加工零件
一、题目
题目描述
凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有 nnn 位工人,工人们从 1∼n1 \sim n1∼n 编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。
如果 xxx 号工人想生产一个被加工到第 L(L>1)L (L \gt 1)L(L>1) 阶段的零件,则所有与 xxx 号工人有传送带直接相连的工人,都需要生产一个被加工到第 L−1L - 1L−1 阶段的零件(但 xxx 号工人自己无需生产第 L−1L - 1L−1 阶段的零件)。
如果 xxx 号工人想生产一个被加工到第 1 阶段的零件,则所有与 xxx 号工人有传送带直接相连的工人,都需要为 xxx 号工人提供一个原材料。
轩轩是 1 号工人。现在给出 qqq 张工单,第 iii 张工单表示编号为 aia_iai 的工人想生产一个第 LiL_iLi 阶段的零件。轩轩想知道对于每张工单,他是否需要给别人提供原材料。他知道聪明的你一定可以帮他计算出来!
输入格式
第一行三个正整数 nnn,mmm 和 qqq,分别表示工人的数目、传送带的数目和工单的数目。
接下来 mmm 行,每行两个正整数 uuu 和 vvv,表示编号为 uuu 和 vvv 的工人之间存在一条零件传输带。保证 u≠vu \neq vu=v。
接下来 qqq 行,每行两个正整数 aaa 和 LLL,表示编号为 aaa 的工人想生产一个第 LLL 阶段的零件。
输出格式
共 qqq 行,每行一个字符串 Yes
或者 No
。如果按照第 iii 张工单生产,需要编号为 1 的轩轩提供原材料,则在第 iii 行输出 Yes
;否则在第 iii 行输出 No
。注意输出不含引号。
样例
样例输入 1
3 2 6
1 2
2 3
1 1
2 1
3 1
1 2
2 2
3 2
样例输出 1
No
Yes
No
Yes
No
Yes
样例解释 1
编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。
编号为 2 的工人想生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。
编号为 3 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。
编号为 1 的工人想生产第 2 阶段的零件,需要编号为 2 的工人生产第 1 阶段的零 件,需要编号为 1 和 3 的工人提供原材料。
编号为 2 的工人想生产第 2 阶段的零件,需要编号为 1 和 3 的工人生产第 1 阶段的零件,他/她们都需要编号为 2 的工人提供原材料。
编号为 3 的工人想生产第 2 阶段的零件,需要编号为 2 的工人生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。
样例输入 2
5 5 5
1 2
2 3
3 4
4 5
1 5
1 1
1 2
1 3
1 4
1 5
样例输出 2
No
Yes
No
Yes
Yes
样例解释 2
编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 和 5 的工人提供原材料。
编号为 1 的工人想生产第 2 阶段的零件,需要编号为 2 和 5 的工人生产第 1 阶段的零件,需要编号为 1,3,41,3,41,3,4 的工人提供原材料。
编号为 1 的工人想生产第 3 阶段的零件,需要编号为 2 和 5 的工人生产第 2 阶段的零件,需要编号为 1,3,41,3,41,3,4 的工人生产第 1 阶段的零件,需要编号为 2,3,4,52,3,4,52,3,4,5 的工人提供原材料。
编号为 1 的工人想生产第 4 阶段的零件,需要编号为 2 和 5 的工人生产第 3 阶段的零件,需要编号为 1,3,41,3,41,3,4 的工人生产第 2 阶段的零件,需要编号为 2,3,4,52,3,4,52,3,4,5 的工人生产第 1 阶段的零件,需要全部工人提供原材料。
编号为 1 的工人想生产第 5 阶段的零件,需要编号为 2 和 5 的工人生产第 4 阶段的零件,需要编号为 1,3,41,3,41,3,4 的工人生产第 3 阶段的零件,需要编号为 2,3,4,52,3,4,52,3,4,5 的工人生产第 2 阶段的零件,需要全部工人生产第 1 阶段的零件,需要全部工人提供原材料。
数据范围
共 20 个测试点。
1≤u,v,a≤n1 \leq u, v, a \leq n1≤u,v,a≤n。
测试点 1~4,1≤n,m≤10001 \leq n, m \leq 10001≤n,m≤1000,q=3q = 3q=3,L=1L = 1L=1。
测试点 5~8,1≤n,m≤10001 \leq n, m \leq 10001≤n,m≤1000,q=3q = 3q=3,1≤L≤101 \leq L \leq 101≤L≤10。
测试点 9~12,1≤n,m,L≤10001 \leq n, m, L \leq 10001≤n,m,L≤1000,1≤q≤1001 \leq q \leq 1001≤q≤100。
测试点 13~16,1≤n,m,L≤10001 \leq n, m, L \leq 10001≤n,m,L≤1000,1≤q≤1051 \leq q \leq 10^51≤q≤105。
测试点 17~20,1≤n,m,q≤1051 \leq n, m, q \leq 10^51≤n,m,q≤105,1≤L≤1091 \leq L \leq 10^91≤L≤109。
二、分析
题目大意为在一张图上给定一个点 iii ,若从 iii 点走 LLL 条边后可以到达 1 号点,输出 Yes
否则输出 No
;
则可知若 LLL 条边走 1 到 iii 的最短路都不能到达 1 ,则一定不能到达 1 号点,所以若 1 到 iii 的最短路大于 LLL 则输出 No
;
由于只需判断是否最终走到 1 ,所以可以想到通过奇偶性来判断;
又由于若 [1,i][1, i][1,i] 的最短路径长度为奇数,则只要 LLL 为大于最短路的奇数,则点 1 一定要提供原材料;
同理,若 [1,i][1, i][1,i] 的最短路径长度为偶数,则只要 LLL 为大于最短路的偶数,则点 1 一定要提供原材料;
所以可以以 1 号节点为源点,用单源最短路分别求出 [1,i][1, i][1,i] 走奇数条边与走偶数条边的最短路;
在判断时,若 LLL 为奇数且 LLL 大于 [1,i][1, i][1,i] 走奇数条边最短路长度,则可以走到 1 号点;
同理,若 LLL 为偶数且 LLL 大于 [1,i][1, i][1,i] 走偶数条边最短路长度,则可以走到 1 号点;
三、代码
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
#define MAXN 100005
using namespace std;
int n, m, q;
vector <int> g[MAXN];
int dis[MAXN][2]; // 0 为走偶数条边的最短路, 1 为走奇数条边的最短路
void dijkstra(int s) {queue <int> q;memset(dis, 0x3f, sizeof(dis));dis[s][0] = 0; // 只需赋跑偶数条边的初值 q.push(s);while (!q.empty()) {int t = q.front();q.pop();int l = g[t].size();for (int i = 0; i < l; i++) {int v = g[t][i]; if (dis[v][0] > dis[t][1] + 1) { // 偶数边最短路 dis[v][0] = dis[t][1] + 1;q.push(v);}if (dis[v][1] > dis[t][0] + 1) { // 奇数边最短路 dis[v][1] = dis[t][0] + 1;q.push(v);}}}
}
int main() {scanf("%d %d %d", &n, &m, &q);for (int i = 1; i <= m; i++) {int x, y;scanf("%d %d", &x, &y);g[x].push_back(y); // 双向建边 g[y].push_back(x);}dijkstra(1); // 最短路 for (int i = 1; i <= q; i++) {int x, y;scanf("%d %d", &x, &y);if (dis[x][y & 1] <= y) { // 判断是否可行 printf("Yes\n");} else {printf("No\n");}}
}
[CSP-J 2019] 加工零件题解相关推荐
- 信息学奥赛一本通 1985:【19CSPJ普及组】加工零件 | 洛谷 P5663 [CSP-J2019] 加工零件
[题目链接] ybt 1985:[19CSPJ普及组]加工零件 洛谷 P5663 [CSP-J2019] 加工零件 [题目考点] 图论 SPFA算法 [解题思路] 1. 问题分析 每个工人是一个顶点, ...
- CSP认证 202009-4 星际旅行 Python 题解 思路清晰
CSP认证 202009-4 星际旅行 Python 题解 思路清晰 本题找对数学关系就很容易求了,分三种情况: P1,P2的连线 与圆心的距离 >=r,即这条直线在园外,P1和P2的最短距离就 ...
- CSP - J 2020 T1 优秀的拆分
https://www.luogu.com.cn/problem/P7071 /* CSP - J 2020 T1 优秀的拆分 https://www.luogu.com.cn/problem/P70 ...
- 信息学奥赛第九节 —— 贪心算法(需要安排几位师傅加工零件 + 排队打水问题)
贪心算法的特点 对于问题求解时,总是做出在当前来看是最好的选择的策略,即贪心算法不从整体来考虑问题.贪心算法与排序.高精度.背包等算法不同,没有一个特定的模板来表达贪心算法的过程. 贪心的步骤 抽象出 ...
- 全球及中国精密加工零件行业市场需求及未来发展展望报告2022-2028年
全球及中国精密加工零件行业市场需求及未来发展展望报告2022-2028年 详情内容请咨询鸿晟信合研究网! [全新修订]:2022年3月 [撰写单位]:鸿晟信合研究网 1 精密加工零件行业概述 1.1 ...
- 【2019CSP-J普及组】T4 加工零件
P5663 加工零件 题目传送门 SPFA对于每个点是可多次出队入队的,so数组要开大些(检查40分钟 2个WA) 思路: 举个栗子: 7号工人做一个第5个阶段的零件,1号工人是否要做原材料? 可以看 ...
- 数控加工零件工艺性分析
数控机床的出现是工业一大进步的表现,它能较好的解决复杂.精密.小批.多变的零件加工问题,是一种灵活的.高效率的自动化机床.程序编制人员在利用数控机床加工时,首先得进行工艺分析. 一.机床的合理选用 在 ...
- 在数控机床上加工零件,主要取决于加工程序
在数控机床上加工零件,主要取决于加工程序 数控机床的操作和监控全部在这个数控单元中完成,它是数控机床的大脑.与普通机床相比,数控机床有如下特点: 1.对加工对象的适应性强,适应模具等产品单件生产的特点 ...
- Python While循环与break语句_加工零件
编程要求 本关的编程任务是补全line.py文件中的判断语句部分,具体要求如下: 填入当已处理零件数小于总零件数count < partcount时的while循环判断语句. 在停电时填入bre ...
最新文章
- c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
- 编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理
- 生信分析-PS修改坐标
- 多种特征提取算法比较汇总
- boost::r_c_shortest_paths用法的测试程序
- 邮宝打印面单尺寸调整_摆脱束缚,自由轻松!无线打印奥利给(上)
- Opencv一维直方图的绘制
- vue中v-bind指令的使用之Vue知识点归纳(七)
- 如何解决无法显示隐藏文件文件夹
- Linux内存错误系统重启,linux服务器硬件报错,系统异常重启检测-MCElog
- addActionError addFieldErrot addActionMessage 的区别
- 17.Linux 高性能服务器编程 --- 系统检测工具
- 【原】115网盘下载地址解析工具(暂停更新)
- matlab人脸识别论文
- 【STM32F429开发板用户手册】第2章 STM32F429的开发环境搭建
- windows批处理备份压缩文件夹rar
- android 汉字拼音排序,Android实现中文按拼音排序方法
- csgo服务器显示连接中,CSGO提示连接到官方任意服务器失败怎么办?
- javaScript 关于console的理解
- PHP修改后缀名绕过
热门文章
- 安卓 类微信界面开发(一)
- win10防火墙打不开,设置是灰色的、edge闪退、应用商店灰色等问题
- ajax怎样获取json数据,如何使用ajax读取Json中的数据
- r语言 svycoxph_R语言-Cox比例风险模型
- 前端进阶-ES6函数
- XingGAN for Person Image Generation(人体姿势生成笔记)
- linux 脚本实现物理备份,shell脚本实现系统监视统计与数据备份
- 【python】遍历log查找符合关键字的log
- java如何获取当前时间 年月日 时分秒
- php cmyk图片,php – 使用Imagick将图像从RGB转换为CMYK