CSP 真题解析:[CSP-J 2019-T4] 加工零件

发布时间:2026/7/14 0:16:38

CSP 真题解析:[CSP-J 2019-T4] 加工零件
[CSP-J 2019-T4]加工零件摘要本文详细解析了 CSP-J 2019 第四题「加工零件」的解题思路与 C 实现。题目本质上是判断无向图中从 1 号点出发能否恰好走 L 步到达目标点 a。利用「反复横跳不改变路径奇偶性」的图论性质问题转化为求 1 号点到各点的奇数最短路和偶数最短路。文章通过 BFS 预处理奇偶最短距离实现 O(1) 在线查询并梳理了孤立点特判、数组越界、无穷大初始化等常见易错点附带完整参考代码。题目描述凯凯的工厂正在有条不紊地生产一种神奇的零件神奇的零件的生产过程自然也很神奇。工厂里有n nn位工人工人们从1 ∼ n 1 \sim n1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。如果x xx号工人想生产一个被加工到第L ( L 1 ) L\,(L \gt 1)L(L1)阶段的零件则所有与x xx号工人有传送带直接相连的工人都需要生产一个被加工到第L − 1 L - 1L−1阶段的零件但x xx号工人自己无需生产第L − 1 L - 1L−1阶段的零件。如果x xx号工人想生产一个被加工到第1 11阶段的零件则所有与x xx号工人有传送带直接相连的工人都需要为x xx号工人提供一个原材料。轩轩是1 11号工人。现在给出q qq张工单第i ii张工单表示编号为a i a_iai​的工人想生产一个第L i L_iLi​阶段的零件。轩轩想知道对于每张工单他是否需要给别人提供原材料。他知道聪明的你一定可以帮他计算出来输入格式第一行三个正整数n nnm mm和q qq分别表示工人的数目、传送带的数目和工单的数目。接下来m mm行每行两个正整数u uu和v vv表示编号为u uu和v vv的工人之间存在一条零件传输带。保证u ≠ v u \neq vuv。接下来q qq行每行两个正整数a aa和L LL表示编号为a aa的工人想生产一个第L LL阶段的零件。输出格式共q qq行每行一个字符串Yes或者No。如果按照第i ii张工单生产需要编号为 1 的轩轩提供原材料则在第i ii行输出Yes否则在第i ii行输出No。输入输出样例 #1输入 #13 2 6 1 2 2 3 1 1 2 1 3 1 1 2 2 2 3 2输出 #1No Yes No Yes No Yes输入输出样例 #2输入 #25 5 5 1 2 2 3 3 4 4 5 1 5 1 1 1 2 1 3 1 4 1 5输出 #2No Yes No Yes 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 说明编号为 1 的工人想生产第 1 阶段的零件需要编号为 2 和 5 的工人提供原材料。编号为 1 的工人想生产第 2 阶段的零件需要编号为 2 和 5 的工人生产第 1 阶段的零件需要编号为 1,3,4 的工人提供原材料。编号为 1 的工人想生产第 3 阶段的零件需要编号为 2 和 5 的工人生产第 2 阶段的零件需要编号为 1,3,4 的工人生产第 1 阶段的零件需要编号为 2,3,4,5 的工人提供原材料。编号为 1 的工人想生产第 4 阶段的零件需要编号为 2 和 5 的工人生产第 3 阶段的零件需要编号为 1,3,4 的工人生产第 2 阶段的零件需要编号为 2,3,4,5 的工人生产第 1 阶段的零件需要全部工人提供原材料。编号为 1 的工人想生产第 5 阶段的零件需要编号为 2 和 5 的工人生产第 4 阶段的零件需要编号为 1,3,4 的工人生产第 3 阶段的零件需要编号为 2,3,4,5 的工人生产第 2 阶段的零件需要全部工人生产第 1 阶段的零件需要全部工人提供原材料。数据规模与约定共20 2020个测试点。对所有测试点保证1 ≤ u , v , a ≤ n 1 \leq u, v, a \leq n1≤u,v,a≤n。测试点1 ∼ 4 1\sim41∼41 ≤ n , m ≤ 1000 1 \leq n, m \leq 10001≤n,m≤1000q 3 q 3q3L 1 L 1L1。测试点5 ∼ 8 5\sim85∼81 ≤ n , m ≤ 1000 1 \leq n, m \leq 10001≤n,m≤1000q 3 q 3q31 ≤ L ≤ 10 1 \leq L \leq 101≤L≤10。测试点9 ∼ 12 9\sim129∼121 ≤ n , m , L ≤ 1000 1 \leq n, m, L \leq 10001≤n,m,L≤10001 ≤ q ≤ 100 1 \leq q \leq 1001≤q≤100。测试点13 ∼ 16 13\sim1613∼161 ≤ n , m , L ≤ 1000 1 \leq n, m, L \leq 10001≤n,m,L≤10001 ≤ q ≤ 10 5 1 \leq q \leq 10^51≤q≤105。测试点17 ∼ 20 17\sim2017∼201 ≤ n , m , q ≤ 10 5 1 \leq n, m, q \leq 10^51≤n,m,q≤1051 ≤ L ≤ 10 9 1 \leq L \leq 10^91≤L≤109。思路要点工厂里有n nn个工人工人之间有双向传送带无向图。如果a aa号工人要生产一个第L LL阶段的零件跟他在图上有边直接相连的所有人就要生产第L − 1 L-1L−1阶段的零件以此类推一直传导下去。最后第1 11阶段零件的相邻工人需要提供原材料也就是倒数第0 00阶段。题目问当a aa号工人生产第L LL阶段零件时1 11** 号工人轩轩是否需要提供原材料**关键思路零件生产的“反向需求传递”本质上就是在图上走一步。a aa需要第L LL阶段→ \rightarrow→找与a aa距离为1 11的人第L − 1 L-1L−1阶段→ \rightarrow→找与a aa距离为2 22的人第L − 2 L-2L−2阶段→ \rightarrow→...→ \rightarrow→找与a aa距离为L LL的人提供原材料。因此问题等价转化为在无向图中从a aa点出发能否刚好走L LL步到达1 11号点因为是双向传送带从a aa走L LL步到1 11等价于从1 11号点出发能否刚好走L LL步到达a aa点。无向图有一个重要性质如果从1 11到a aa有一条长度为d dd的路径那么只要我们在一条边上“反复横跳”来回走就可以构造出长度为d 2 , d 4 , d 6 , … d2, d4, d6, \dotsd2,d4,d6,…的路径。****注意但你无法通过反复横跳把一条偶数长度的路径变成奇数长度路径长度的奇偶性在反复横跳中是绝对不变的每次来回必定 2 22。至此我们可以总结下思路要判断能否从1 11走L LL步到达a aa只需要满足两个条件奇偶性相同L LL的奇偶性必须与从1 11到a aa的某条路径的奇偶性相同。长度足够大L LL必须≥ \ge≥从1 11到a aa该奇偶性下的最短路径长度多了的步数我们可以通过反复横跳消耗掉。所以我们只需要针对每个点i ii求出ev[i]从1 11号点到i ii号点的偶数最短路径长度。od[i]从1 11号点到i ii号点的奇数最短路径长度。查询时如果L LL是奇数只要L ≥ o d [ a ] L \ge od[a]L≥od[a]输出Yes否则No。如果L LL是偶数只要L ≥ e v [ a ] L \ge ev[a]L≥ev[a]输出Yes否则No。解题步骤我们以样例 1为例模拟代码的图构建与 BFS 执行过程输入n 3 , m 2 , q 6 n3, m2, q6n3,m2,q6边( 1 , 2 ) , ( 2 , 3 ) (1,2), (2,3)(1,2),(2,3)图的初始化与建边 (链式前向星)代码中使用head,to,nxt数组模拟邻接表插入边1 ↔ 2 1 \leftrightarrow 21↔2和2 ↔ 3 2 \leftrightarrow 32↔3后图结构如下1 11的邻居2 222 22的邻居3 , 1 3, 13,13 33的邻居2 22BFS 初始化设置距离数组起点值定义ev[maxn](偶数最短路) 和od[maxn](奇数最短路)初始全部设为无穷大0x3f3f3f3f。起点为1 11号点走0 00步偶数到自己所以初始化ev[1] 0。将起点1 11压入队列q1.push(1)。BFS 广度优先搜索更新奇偶最短路径我们通过ud(x, y, v)函数进行松弛操作用当前的步数 1 11去更新目标点对应奇偶性的最短路当前边起点 u当前边终点 v松弛逻辑 (当前长度 1)更新后的距离是否入队u 1v 2ev[1]11 (奇数) 去更新 od[2]od[2] 1push(2)u 2v 3od[2]12 (偶数) 去更新 ev[3]ev[3] 2push(3)v 1od[2]12 (偶数) 去更新 ev[1]ev[1]已经是0不更新否u 3v 2ev[3]13 (奇数) 去更新 od[2]od[2]已经是1不更新否此时队列为空BFS 结束。最终得到的距离表1 11号点ev[1] 0,od[1] ∞(注意在图中如果 1 连了 2其实走 2 步可以回到 1这里因为连了边实际循环里如果有边触发会算出ev[1]0, od[1]∞由于 1 到 2 有边真正跑完样例 1 最终会算出ev[1]0, od[1]∞, ev[2]2, od[2]1, ev[3]2, od[3]3具体看反复横跳更新)。处理O ( 1 ) O(1)O(1)判定询问以工单a 1, L 1为例L 1 L1L1为奇数我们查看od[1]。只有当1 11有连边时1 → 2 → 1 1 \rightarrow 2 \rightarrow 11→2→1长度为 2 (偶数)而在样例1中无法 1 步走回 1。此时L o d [ 1 ] L od[1]Lod[1]或o d [ 1 ] od[1]od[1]为无穷大输出No。以工单a 2, L 1为例L 1 L1L1为奇数查看od[2]。我们查表发现od[2] 1。满足l od[a]且奇偶性相同调用jg()函数输出Yes。本题易错点坑一孤立点特判要点提醒如果1 11号点没有连出任何一条边那么任何人想生产零件1 11号点都绝对无法提供原材料所以必须加if(!head[1]) { printf(No\n); continue; }。坑二数组开二倍空间要点提醒链式前向星存无向图一条无向边相当于两条有向边。to和nxt数组必须开到maxn * 2否则会引发数组越界RE。坑三距离数组初始化为无穷大0x3f要点提醒用 BFS 不断更新找最短路径需要给每个点的初识路径长度设为一个极大值。每个字节被设为0x3f整型变量实际上变成了0x3f3f3f3f十进制约 10 亿这个值足够大大于题目最大的边长同时两个0x3f3f3f3f相加不会发生int溢出变成负数。参考代码#includebits/stdc.h#definemaxn100005usingnamespacestd;intn,m,q;intk,to[maxn*2],head[maxn],nxt[maxn*2];// 链式前向星存图数组无向图开两倍空间intev[maxn],od[maxn];// ev: 偶数最短路od: 奇数最短路queueintq1;// BFS 队列voidadde(intu,intv){// 建边: u - vto[k]v;nxt[k]head[u];head[u]k;}// 最短路松弛优化函数用 x 1 的长度去尝试更新目标值 yvoidud(intx,inty,intv){if(x1y){yx1;q1.push(v);// 只有最短路被更新了才需要入队继续推导}}// 求解从结点 1 出发到每个点的最短奇数路径和偶数路径voidbfs(intx){memset(od,0x3f,sizeof(od));// 初始化为无穷大memset(ev,0x3f,sizeof(ev));ev[x]0;// 1号点到自己不需要走偶数长度为 0q1.push(x);while(!q1.empty()){intuq1.front();q1.pop();for(intihead[u];i;inxt[i]){intvto[i];ud(ev[u],od[v],v);// u 的偶数路径 1 v 的奇数路径ud(od[u],ev[v],v);// u 的奇数路径 1 v 的偶数路径}}}// 判定函数l的长度是否大于等于最短路径 c且它们奇偶性相同voidjg(inta,intl,intc){if(lc(l%2c%2)){printf(Yes\n);}else{printf(No\n);}}intmain(){scanf(%d %d %d,n,m,q);while(m--){intu,v;scanf(%d %d,u,v);adde(u,v);adde(v,u);// 无向图建双向边}bfs(1);// O(NM) 预处理 1 号点到所有点的奇偶最短路while(q--){inta,l;scanf(%d %d,a,l);// 特判如果 1 号点是孤立点没有任何传送带相连根本无法向外传递if(!head[1]){printf(No\n);continue;}// 根据阶段 L 的奇偶性选择对应的最短路数组进行比对if(l%2){jg(a,l,od[a]);}else{jg(a,l,ev[a]);}}return0;}

相关新闻

puzzle(1039)划斜线、孤岛迷宫、轮辐连线

puzzle(1039)划斜线、孤岛迷宫、轮辐连线

2026/7/14 0:16:38

目录 划斜线 5*5 策略 7*7 8*8 12*10 孤岛迷宫 初级 中级 策略一:孤岛 策略二:均衡 高级 策略三:大数字分析 专家 策略四:十字路口 轮辐连线 规则 4*4 6*6 划斜线 在线play 在每个方格中划一条对角线&#xf…

这片晶圆报废到底谁的错:我用5Why分析法追到了真根因

这片晶圆报废到底谁的错:我用5Why分析法追到了真根因

2026/7/14 0:16:38

一、背景:三方甩锅良率问题成了悬案那批报废我现在还记得。客户验收时发现20片晶圆的金属层有图案偏移,检测发现对准精度超规,整批报废。20片晶圆,材料成本加返工费用超过60万。早会上,PE说设备状态正常,是来料问题&am…

西安上门家政平台开发系统,保洁技师智能排班系统架构

西安上门家政平台开发系统,保洁技师智能排班系统架构

2026/7/14 0:16:38

西安上门家政平台开发系统,保洁技师智能排班系统架构西安本地上门保洁、家电清洗、全屋整理、日常家政服务需求日益密集,社区家政平台、本地家政门店数字化系统的使用率持续提升。对于家政服务平台而言,技师排班调度是核心运营模块&#xff0…

OpenCV CascadeClassifier人脸检测实战与调优指南

OpenCV CascadeClassifier人脸检测实战与调优指南

2026/7/14 4:56:53

1. 项目概述:当OpenCV遇上CascadeClassifier在计算机视觉领域,人脸检测一直是最基础也最实用的技术之一。作为一名长期使用OpenCV进行图像处理的开发者,我发现cv2.CascadeClassifier这个看似简单的工具,在实际项目中往往能发挥意想…

从M.2到E1.S,从U.2到E3.S:数据中心SSD接口的世代更迭与选择逻辑

从M.2到E1.S,从U.2到E3.S:数据中心SSD接口的世代更迭与选择逻辑

2026/7/14 4:56:53

1. 数据中心SSD接口的演进背景十年前的数据中心还在普遍使用SATA接口的SSD,那时候的存储性能瓶颈往往出现在接口带宽上。随着PCIe技术的普及,NVMe协议的出现彻底改变了这一局面。我清楚地记得2015年第一次测试NVMe SSD时的震撼——顺序读写性能直接从SAT…

Spark环境配置四层契约:JVM/Python/Hadoop/本地层协同指南

Spark环境配置四层契约:JVM/Python/Hadoop/本地层协同指南

2026/7/14 4:56:53

1. 项目概述:为什么 Spark 环境搭建不是“装个包就完事”的事 你搜到“How to set up your environment for Spark”这个标题,大概率正站在两个路口:要么是刚学完 Scala 或 Python,想跑通第一个 spark-submit 却卡在 ClassNot…

从零构建C++日志库:核心原理、多线程安全与异步优化实践

从零构建C++日志库:核心原理、多线程安全与异步优化实践

2026/7/14 4:56:53

1. 项目概述:为什么我们需要亲手打造一个C日志库?在C项目的开发与维护中,日志系统就像项目的“黑匣子”和“诊断仪”。无论你是调试一个诡异的崩溃,追踪线上服务的性能瓶颈,还是复盘一次线上事故,日志都是你…

交换机通过ftp下载文件或者传输文件到ftp服务器

交换机通过ftp下载文件或者传输文件到ftp服务器

2026/7/14 4:56:53

一 背景需求:客户现网存在ftp文件备份服务器,需要ftp服务器作为ssh客户端定时登录到交换机,并在交换机定时执行ftp命令对文件进行备份到ftp服务器。交换机作为ftp客户端,个人PC模拟ftp服务器(使用3CDaemon作为ftp服务器…

从原理到实战:深度解析微信小程序页面栈与路由跳转

从原理到实战:深度解析微信小程序页面栈与路由跳转

2026/7/14 4:46:52

1. 微信小程序页面栈的底层机制想象你正在翻看一本杂志,每次打开新页面时,旧页面会被压在下面但并未消失——这就是微信小程序页面栈的基本原理。页面栈(Page Stack)是小程序运行时维护的页面层级结构,采用经典的后进先…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/13 7:41:16

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/13 20:43:10

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南

XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南

2026/7/14 0:06:37

1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am…

2026普通文员学数据分析的价值

2026普通文员学数据分析的价值

2026/7/14 0:06:37

一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a…

2026从计划员到主管,生产管理者学数据分析有用吗?

2026从计划员到主管,生产管理者学数据分析有用吗?

2026/7/14 0:06:37

一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&…