[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] 加工零件题解相关推荐

  1. 信息学奥赛一本通 1985:【19CSPJ普及组】加工零件 | 洛谷 P5663 [CSP-J2019] 加工零件

    [题目链接] ybt 1985:[19CSPJ普及组]加工零件 洛谷 P5663 [CSP-J2019] 加工零件 [题目考点] 图论 SPFA算法 [解题思路] 1. 问题分析 每个工人是一个顶点, ...

  2. CSP认证 202009-4 星际旅行 Python 题解 思路清晰

    CSP认证 202009-4 星际旅行 Python 题解 思路清晰 本题找对数学关系就很容易求了,分三种情况: P1,P2的连线 与圆心的距离 >=r,即这条直线在园外,P1和P2的最短距离就 ...

  3. CSP - J 2020 T1 优秀的拆分

    https://www.luogu.com.cn/problem/P7071 /* CSP - J 2020 T1 优秀的拆分 https://www.luogu.com.cn/problem/P70 ...

  4. 信息学奥赛第九节 —— 贪心算法(需要安排几位师傅加工零件 + 排队打水问题)

    贪心算法的特点 对于问题求解时,总是做出在当前来看是最好的选择的策略,即贪心算法不从整体来考虑问题.贪心算法与排序.高精度.背包等算法不同,没有一个特定的模板来表达贪心算法的过程. 贪心的步骤 抽象出 ...

  5. 全球及中国精密加工零件行业市场需求及未来发展展望报告2022-2028年

    全球及中国精密加工零件行业市场需求及未来发展展望报告2022-2028年 详情内容请咨询鸿晟信合研究网! [全新修订]:2022年3月 [撰写单位]:鸿晟信合研究网 1 精密加工零件行业概述 1.1 ...

  6. 【2019CSP-J普及组】T4 加工零件

    P5663 加工零件 题目传送门 SPFA对于每个点是可多次出队入队的,so数组要开大些(检查40分钟 2个WA) 思路: 举个栗子: 7号工人做一个第5个阶段的零件,1号工人是否要做原材料? 可以看 ...

  7. 数控加工零件工艺性分析

    数控机床的出现是工业一大进步的表现,它能较好的解决复杂.精密.小批.多变的零件加工问题,是一种灵活的.高效率的自动化机床.程序编制人员在利用数控机床加工时,首先得进行工艺分析. 一.机床的合理选用 在 ...

  8. 在数控机床上加工零件,主要取决于加工程序

    在数控机床上加工零件,主要取决于加工程序 数控机床的操作和监控全部在这个数控单元中完成,它是数控机床的大脑.与普通机床相比,数控机床有如下特点: 1.对加工对象的适应性强,适应模具等产品单件生产的特点 ...

  9. Python While循环与break语句_加工零件

    编程要求 本关的编程任务是补全line.py文件中的判断语句部分,具体要求如下: 填入当已处理零件数小于总零件数count < partcount时的while循环判断语句. 在停电时填入bre ...

最新文章

  1. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
  2. 编写高质量代码改善C#程序的157个建议——建议86:Parallel中的异常处理
  3. 生信分析-PS修改坐标
  4. 多种特征提取算法比较汇总
  5. boost::r_c_shortest_paths用法的测试程序
  6. 邮宝打印面单尺寸调整_摆脱束缚,自由轻松!无线打印奥利给(上)
  7. Opencv一维直方图的绘制
  8. vue中v-bind指令的使用之Vue知识点归纳(七)
  9. 如何解决无法显示隐藏文件文件夹
  10. Linux内存错误系统重启,linux服务器硬件报错,系统异常重启检测-MCElog
  11. addActionError addFieldErrot addActionMessage 的区别
  12. 17.Linux 高性能服务器编程 --- 系统检测工具
  13. 【原】115网盘下载地址解析工具(暂停更新)
  14. matlab人脸识别论文
  15. 【STM32F429开发板用户手册】第2章 STM32F429的开发环境搭建
  16. windows批处理备份压缩文件夹rar
  17. android 汉字拼音排序,Android实现中文按拼音排序方法
  18. csgo服务器显示连接中,CSGO提示连接到官方任意服务器失败怎么办?
  19. javaScript 关于console的理解
  20. PHP修改后缀名绕过

热门文章

  1. 安卓 类微信界面开发(一)
  2. win10防火墙打不开,设置是灰色的、edge闪退、应用商店灰色等问题
  3. ajax怎样获取json数据,如何使用ajax读取Json中的数据
  4. r语言 svycoxph_R语言-Cox比例风险模型
  5. 前端进阶-ES6函数
  6. XingGAN for Person Image Generation(人体姿势生成笔记)
  7. linux 脚本实现物理备份,shell脚本实现系统监视统计与数据备份
  8. 【python】遍历log查找符合关键字的log
  9. java如何获取当前时间 年月日 时分秒
  10. php cmyk图片,php – 使用Imagick将图像从RGB转换为CMYK