当前位置: 首页 > news >正文

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 n1n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。

如果x xx号工人想生产一个被加工到第L ( L > 1 ) L\,(L \gt 1)L(L>1)阶段的零件,则所有x xx号工人有传送带直接相连的工人,都需要生产一个被加工到第L − 1 L - 1L1阶段的零件(但x xx号工人自己无需生产第L − 1 L - 1L1阶段的零件)。

如果x xx号工人想生产一个被加工到第1 11阶段的零件,则所有x xx号工人有传送带直接相连的工人,都需要为x xx号工人提供一个原材料。

轩轩是1 11号工人。现在给出q qq张工单,第i ii张工单表示编号为a i a_iai的工人想生产一个第L i L_iLi阶段的零件。轩轩想知道对于每张工单,他是否需要给别人提供原材料。他知道聪明的你一定可以帮他计算出来!

输入格式

第一行三个正整数n nnm mmq qq,分别表示工人的数目、传送带的数目和工单的数目。

接下来m mm行,每行两个正整数u uuv vv,表示编号为u uuv vv的工人之间存在一条零件传输带。保证u ≠ v u \neq vu=v

接下来q qq行,每行两个正整数a aaL LL,表示编号为a aa的工人想生产一个第L LL阶段的零件。

输出格式

q qq行,每行一个字符串Yes或者No。如果按照第i ii张工单生产,需要编号为 1 的轩轩提供原材料,则在第i ii行输出Yes;否则在第i ii行输出No

输入输出样例 #1

输入 #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

输入输出样例 #2

输入 #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

说明/提示

样例 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 n1u,v,an

测试点1 ∼ 4 1\sim4141 ≤ n , m ≤ 1000 1 \leq n, m \leq 10001n,m1000q = 3 q = 3q=3L = 1 L = 1L=1

测试点5 ∼ 8 5\sim8581 ≤ n , m ≤ 1000 1 \leq n, m \leq 10001n,m1000q = 3 q = 3q=31 ≤ L ≤ 10 1 \leq L \leq 101L10

测试点9 ∼ 12 9\sim129121 ≤ n , m , L ≤ 1000 1 \leq n, m, L \leq 10001n,m,L10001 ≤ q ≤ 100 1 \leq q \leq 1001q100

测试点13 ∼ 16 13\sim1613161 ≤ n , m , L ≤ 1000 1 \leq n, m, L \leq 10001n,m,L10001 ≤ q ≤ 10 5 1 \leq q \leq 10^51q105

测试点17 ∼ 20 17\sim2017201 ≤ n , m , q ≤ 10 5 1 \leq n, m, q \leq 10^51n,m,q1051 ≤ L ≤ 10 9 1 \leq L \leq 10^91L109

思路要点

工厂里有n nn个工人,工人之间有双向传送带(无向图)。

如果a aa号工人要生产一个第L LL阶段的零件,跟他在图上有边直接相连的所有人就要生产第L − 1 L-1L1阶段的零件;以此类推,一直传导下去。最后第1 11阶段零件的相邻工人需要提供原材料(也就是倒数第0 00阶段)。

题目问:当a aa号工人生产第L LL阶段零件时,1 11** 号工人(轩轩)是否需要提供原材料?**

关键思路

零件生产的“反向需求传递”,本质上就是在图上走一步

至此,我们可以总结下思路:要判断能否从1 11L LL步到达a aa,只需要满足两个条件:

所以,我们只需要针对每个点i ii,求出:

查询时:

解题步骤

我们以样例 1为例,模拟代码的图构建与 BFS 执行过程:

输入:

n = 3 , m = 2 , q = 6 n=3, m=2, q=6n=3,m=2,q=6

边:( 1 , 2 ) , ( 2 , 3 ) (1,2), (2,3)(1,2),(2,3)

  1. 图的初始化与建边 (链式前向星)

代码中使用head,to,nxt数组模拟邻接表:

  1. BFS 初始化:设置距离数组起点值

定义ev[maxn](偶数最短路) 和od[maxn](奇数最短路),初始全部设为无穷大0x3f3f3f3f

  1. BFS 广度优先搜索更新奇偶最短路径

    我们通过ud(x, y, v)函数进行松弛操作(用当前的步数+ 1 +1+1去更新目标点对应奇偶性的最短路):

    当前边起点 u当前边终点 v松弛逻辑 (当前长度 + 1)更新后的距离是否入队
    u = 1v = 2ev[1]+1=1 (奇数) 去更新 od[2]od[2] = 1push(2)
    u = 2v = 3od[2]+1=2 (偶数) 去更新 ev[3]ev[3] = 2push(3)
    v = 1od[2]+1=2 (偶数) 去更新 ev[1]ev[1]已经是0,不更新
    u = 3v = 2ev[3]+1=3 (奇数) 去更新 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,具体看反复横跳更新)。

  2. 处理O ( 1 ) O(1)O(1)判定询问

本题易错点

参考代码

#include<bits/stdc++.h>#definemaxn100005usingnamespacestd;intn,m,q;intk,to[maxn*2],head[maxn],nxt[maxn*2];// 链式前向星存图数组,无向图开两倍空间intev[maxn],od[maxn];// ev: 偶数最短路;od: 奇数最短路queue<int>q1;// BFS 队列voidadde(intu,intv){// 建边: u -> vto[++k]=v;nxt[k]=head[u];head[u]=k;}// 最短路松弛优化函数:用 x + 1 的长度去尝试更新目标值 yvoidud(intx,int&y,intv){if(x+1<y){y=x+1;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()){intu=q1.front();q1.pop();for(inti=head[u];i;i=nxt[i]){intv=to[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(l>=c&&(l%2==c%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(N+M) 预处理 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;}
http://www.jsqmd.com/news/1183751/

相关文章:

  • 娄底市活动板房工厂哪家技术强服务好 - 热点品牌推荐
  • 2026年启东热水器维修靠谱服务商选择榜单参考 - 热点品牌推荐
  • ChatGPT联网搜索失败,92%开发者误判为网络问题——真实根因竟是LLM推理会话上下文污染导致Search Agent进程静默退出(含strace复现脚本)
  • TEL CX80-000541-V1 嵌入式计算机
  • 2026 鹤山黄金回收避坑攻略正规连锁门店实测,闲置黄金足额变现不踩雷 - 福金阁黄金回收
  • XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南
  • 2026年运城刑事律师推荐 畅军峰律师多年刑辩实务经验值得信赖 - 本地品牌推荐
  • PFU Limited CX80-000541-12 控制器模块
  • 大学生学科竞赛项目管理系统开题报告
  • 宇舶金表多少钱的售后维修保养费用解析权威公示(2026年7月最新) - 亨得利官方服务中心
  • 2026年大厂有实力的公共空间装修厂家公司电话参考汇总 - 热点品牌推荐
  • 卡地亚中国官方售后服务中心|服务电话及完整官方地址权威信息通告(2026年7月更新) - 卡地亚官方售后中心
  • 出海之前,境内公司的账要先做成什么样?|ODI备案前理账 - 欢欢在创业
  • 拒绝“股神附体”:牛市是散户亏损的主要原因
  • 为什么你的Chain-of-Thought总不生效?——基于1786组A/B测试的提示词结构熵值分析报告
  • 南阳宛城区黄金回收避坑全攻略!金价高位变现别踩火烧套路,本地 3 家正规门店地址电话一览 - 福金阁黄金回收
  • 2026普通文员学数据分析的价值
  • 2026年 废旧电线电缆回收厂家/公司最新推荐榜单:环保拆解、高纯度铜铝高效提纯与诚信高价企业深度解析 - 甄选服务推荐
  • TEEM PHOTONICS SNU-20F-PDC 微芯片激光器
  • 研究生双选信息发布系统开题报告
  • 雅典中国官方售后服务中心|官方地址与维修热线权威信息通知(2026年7月更新) - 亨得利官方服务中心
  • 2026玻璃温室源头厂家综合评测 走访山东梵和建设工程 - 起跑123
  • Win7纯净重装指南:告别捆绑软件,掌握系统恢复核心技能
  • 2026年北京提升推拉系列大阳台制造厂工厂选购参考指南 - 热点品牌推荐
  • 2028 年 1 月起索尼停售 PS 实体光盘,数字下载占比 78%成主因
  • puzzle(1039)划斜线、孤岛迷宫、轮辐连线
  • 2026年启东燃气灶维修怎么选 本地正规服务商选择指南 - 热点品牌推荐
  • 2026年郓城小区绿化路沿石回收商行业优质服务商实力榜单盘点 - 热点品牌推荐
  • 【2026-07-13】待领养宠物信息汇总(发布于微信小程序:易领宠)
  • Partial Conversion