题目描述

凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有 n 位工人,工人们从 1 ∼n 编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。

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

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

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

输入格式

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

接下来 m 行,每行两个正整数 u 和 v,表示编号为 u 和 v 的工人之间存在一条零件传输带。保证 u 不等于 v。

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

输出格式

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

正文开始:

这个题不难看出(我当时死活没看出来)是个奇偶数最短路(瞎起的名字),大体意思就是,一个位置要单数零件,和他相邻单数长度且长度不超过零件等级的位置都要提供原料。(想象2个工人互相给零件,距离原点的距离和原点零件等级跟最后谁做原零件都是有关系的)

我们可以用链式前向星建图,广搜遍历,每到达一个新的点还要判断这次的距离是不是更短,要把距离1号点的奇偶数距离记成最小的。不可以只记有没有,万一1号点做2号零件,你距离1号点100格远,肯定用不到你。对了,广搜有个剪枝,如果这个点的奇偶距离都没变,哪继续求就没意义了,之前肯定进过队列,所以直接抛弃它。

一号点可以和任何一个相邻的点循环给零件,所以一号点距离1号点的初始值是0。(为什么不能是2,又不会制作等级0的零件? 因为要根据1号点距离自己的偶数位置求其他点的奇数位置。)

上一句话有个地方有点重要(任何一个相邻的点),重点不是任何,是相邻的点,我们要特判,如果一号没有相邻的点,输入什么都输出0。上面的初始偶数距离是0也不管用。

可能会奇妙的转圈圈,所以奇偶数的初始值要定义的很大。

差不多就这样,不会链式前向星的同学可以去翻看之前的博客

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
queue<long long>bj;
long long shu=1,a[100005],p,n,m,z1,z2,ji[100005],ou[100005],f;
struct hehe
{
long long w,nxt;
}sz[200005];
void add(long long z1,long long z2)
{
sz[shu].nxt=a[z1];
sz[shu].w=z2;
a[z1]=shu;
shu++;
}
void bfs()
{
bj.push(1);
ou[1]=0;
while(bj.empty()!=true)
{
long long bl=bj.front();
bj.pop();
for(long long i=a[bl];i!=0;i=sz[i].nxt)
{
if(ou[bl]+1<ji[sz[i].w]||ji[bl]+1<ou[sz[i].w])
{
bj.push(sz[i].w);
}
ji[sz[i].w]=min(ji[sz[i].w],ou[bl]+1);
ou[sz[i].w]=min(ou[sz[i].w],ji[bl]+1);
}
}
}
int main()
{
scanf("%lld%lld%lld",&n,&m,&p);
for(long long i=1;i<=100005;i++)
{
ji[i]=99999999;
ou[i]=99999999;
}
for(long long i=0;i<m;i++)
{
scanf("%lld%lld",&z1,&z2);
add(z1,z2);
add(z2,z1);
if(z1==1||z2==1)
{
f=1;
}
}
bfs();
for(long long i=0;i<p;i++)
{
scanf("%lld%lld",&z1,&z2);
if(f!=1)
{
cout<<"No"<<endl;
continue;
}
if(ou[z1]<=z2&&z2%2==0)
{
cout<<"Yes"<<endl;
continue;
}
if(ji[z1]<=z2&z2%2==1)
{
cout<<"Yes"<<endl;
continue;
}
cout<<"No"<<endl;
}
return 0;
}

当时可能傻了吧。

2019CSP-J T4 加工零件的更多相关文章

  1. P5663 加工零件

    P5663 加工零件 题解 暴力搜索 搜索显然会TLE #include<iostream> #include<cstdio> #include<cstdlib> ...

  2. 洛谷 P5663 加工零件

    题目传送门 解题思路: 最暴力的做法: bfs模拟,每次将一个阶段的所有点拿出来,将其所有直连的点都放进队列,知道本阶段结束,最后看1号点会不会在最后一个阶段被放入队列.(洛谷数据40分) 优化了一下 ...

  3. 洛谷 P5663 加工零件 & [NOIP2019普及组] (奇偶最短路)

    传送门 解题思路 很容易想到用最短路来解决这一道问题(题解法),因为两个点之间可以互相无限走,所以如果到某个点的最短路是x,那么x+2,x+4也一定能够达到. 但是如何保证这是正确的呢?比如说到某个点 ...

  4. 题解 P5663 【加工零件【民间数据】】

    博客园体验更佳 讲讲我的做法 确定做法 首先,看到这道题,我直接想到的是递归,于是复杂度就上天了,考虑最短路. 如何用最短路 首先,看一张图 我们该如何解决问题? 问题:\(3\)做\(5\)阶段的零 ...

  5. 题解 CSP2019-J2T4【加工零件】

    这题我们要求的是啥呢?仔细读题可以发现,工人传送带的关系可以看成一个 \(n\) 个点和 \(m\) 条边的无向图,然后对于每组询问 \((a,L)\),其实就是问: \(1\) 到 \(a\) 有没 ...

  6. CSP-J2019 加工零件

    Background: 之前 $noip $死了,泥萌都说 \(noip SPFA\) 了,现在 \(noip\) 复活了,所以 \(SPFA\) 也复活了. (注:这里的 \(noip\) 跟 \( ...

  7. P5663 加工零件 题解

    原题链接 简要题意: 给定一个图,每次询问从 \(x\) 节点开始,\(y\) 步能不能达到 \(1\) 号节点. 算法一 这也是我本人考场算法.就是 深搜 . 因为你会发现,如果 \(x\) 用 \ ...

  8. CSP-J/S2019试题选做

    S D1T2 括号树 设\(f[u]\)表示根到\(u\)的路径上有多少子串是合法括号串.(即题目里的\(k_u\),此变量名缺乏个性,故换之) 从根向每个节点dfs,容易求出\(c[u]\):表示从 ...

  9. 【游记】CSP J/S 2019 游记

    J 组 \(2:30\)开始, \(2:13\)还在酒店的我看了看手表...飞奔考场. T1 数字游戏 秒切. 下午某中学某大佬说可用线性基(%) T2 公交换乘 用单调队列思想,秒切. T3 纪念品 ...

随机推荐

  1. cb50a_c++_STL_算法_局部排序partial_sort

    cb50a_c++_STL_算法_局部排序partial_sort partial_sort(b,se,e)排序一部分,begin,source end,endcout << " ...

  2. tarjan算法求scc & 缩点

    前置知识 图的遍历(dfs) 强连通&强连通分量 对于有向图G中的任意两个顶点u和v存在u->v的一条路径,同时也存在v->u的路径,我们则称这两个顶点强连通.以此类推,强连通分量 ...

  3. 爬取B站弹幕并且制作词云

    目录 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 制作词云 1.文件读取 2.代码 爬取弹幕 1. 从手机端口进入网页爬取找到接口 2.代码 import requests from l ...

  4. 二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引. B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的. 在 ...

  5. ECSHOP后台左侧添加菜单栏

    比如我们在后台中增加 “活动管理”功能,方法如下 在ECSHOP 管理中心共用语言文件 language\zh_cn\admin\commn.php ,添加我们的自定义菜单: $_LANG['17_a ...

  6. 入门大数据---MapReduce-API操作

    一.环境 Hadoop部署环境: Centos3.10.0-327.el7.x86_64 Hadoop2.6.5 Java1.8.0_221 代码运行环境: Windows 10 Hadoop 2.6 ...

  7. 入门大数据---Flume 简介及基本使用

    一.Flume简介 Apache Flume 是一个分布式,高可用的数据收集系统.它可以从不同的数据源收集数据,经过聚合后发送到存储系统中,通常用于日志数据的收集.Flume 分为 NG 和 OG ( ...

  8. 推荐一种通过刷leetcode来增强技术功底的方法

    背景 如果前人认为这个一种学习提高或者检验能力的成功实践.而自己目前又没有更好的方法,那就不妨试一试. 而不管作为面试官还是被面试者,编码题最近越来越流行.而两种角色都需要思考的问题是希望考察什么能力 ...

  9. python递归函数实现阶乘函数

    实现的效果如下: 参考www.cnblogs.com/yuanchenqi/articles/5828233.html f(5)=5*4*3*2*1=120   f(7)=7*6*5*4*3*2*1= ...

  10. h5页面自动播放视频、音频_关于媒体文件自动全屏播放的实现方式

    在移动端(ios和android)播放视频的时候,我们即使定义了autoplay属性,仍然不能自动播放.这是由于手机浏览器为了防止浪费用户的网络流量,在默认情况下是不允许媒体文件自动播放的,除非用户自 ...