博客园体验更佳

讲讲我的做法

确定做法

首先,看到这道题,我直接想到的是递归,于是复杂度就上天了,考虑最短路

如何用最短路

首先,看一张图

我们该如何解决问题?

问题:\(3\)做\(5\)阶段的零件\(1\)要不要做呢?

其实,实质就是看\(3\)到\(1\)有没有长度为\(5\)的路径。

问题:\(3\)做\(7\)阶段的零件\(1\)要不要做呢?

其实,实质就是看\(3\)到\(1\)有没有长度为\(7\)的路径。

问题:\(3\)做\(6\)阶段的零件\(1\)要不要做呢?

其实,实质就是看\(3\)到\(1\)有没有长度为\(6\)的路径。

仔细思考这\(3\)个问题,我们会发现,如果\(3\)到\(1\)有长度为\(5\)的路径,那么\(3\)到\(1\)一定有长度为\(7\)的路径,但并不一定有长度为\(6\)的路径。

所以,我们要对每个点求一遍奇数路径,和偶数路径。

实现最短路

最短路的算法有很多,这道题最好用\(dijkstra\),或\(bfs\)。

这道题的时限并不紧,并且\(dijkstra\)细节太多,我就来演示\(bfs\)实现的最短路

void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
q.push(make_pair(1,0));
ou[1]=0;
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}

\(v\)数组是一个动态数组,也就是\(vector\),曹老师教我们多用\(STL\)写程序

如果你写这样的\(bfs\)民间数据会\(WA\) \(1\)个点 ,这个点是这样的

\(1\)号点是一个孤点,没有偶数路径,所以,我们的\(bfs\)要这么写

void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
for(int i=0;i<v[1].size();i++){
ji[v[1][i]]=1;
q.push(make_pair(v[1][i],1));
}
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}

简要讲解主程序

有了这些主程序应该是很简单的了

int main(){
int n,m,q;
read(n);read(m);read(q);
for(int i=1;i<=m;i++){
int x,y;
read(x);read(y);//无向边
v[x].push_back(y);//连边
v[y].push_back(x);//连边
}
bfw();//跑最短路
while(q--){
int x,y;
read(x);read(y);
if(y%2==0){
if(ou[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}else{
if(ji[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}
}
return 0;
}

总结

先来看一看这题完整的代码了

#include <bits/stdc++.h>
using namespace std;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}
template<typename T>void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>9)write(x/10);
putchar(x%10+48);
}
vector<int>v[100010];
int ji[100010],ou[100010];
void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
memset(ji,0x3f,sizeof(ji));//奇数最短路径
memset(ou,0x3f,sizeof(ou));//偶数最短路径
queue<pair<int,int> >q;
for(int i=0;i<v[1].size();i++){
ji[v[1][i]]=1;
q.push(make_pair(v[1][i],1));
}
while(q.size()){
int x=q.front().first,y=q.front().second;
for(int i=0;i<v[x].size();i++){
if(y%2==1){//奇数+1=偶数
if(y+1<ou[v[x][i]]){
ou[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}else{//偶数+1=奇数
if(y+1<ji[v[x][i]]){
ji[v[x][i]]=y+1;//更新答案
q.push(make_pair(v[x][i],y+1));
}
}
}
q.pop();
}
}
int main(){
int n,m,q;
read(n);read(m);read(q);
for(int i=1;i<=m;i++){
int x,y;
read(x);read(y);//无向边
v[x].push_back(y);//连边
v[y].push_back(x);//连边
}
bfw();//跑最短路
while(q--){
int x,y;
read(x);read(y);
if(y%2==0){
if(ou[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}else{
if(ji[x]>y)puts("No");//如果大于就不可能了
else puts("Yes");
}
}
return 0;
}

这道题还是比较有思维含量的,民间数据也出的很好,让我们思考全面。

最后,还是希望大家不懂就在评论区问,觉得好就点赞!

题解 P5663 【加工零件【民间数据】】的更多相关文章

  1. P5663 加工零件

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

  2. P5663 加工零件 题解

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

  3. 洛谷 P5663 加工零件

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

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

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

  5. P5657 格雷码【民间数据】

    P5657 格雷码[民间数据] 题解 其实这题水啊 打表找规律 [1]0   1 [2]00   01  11  10 [3]000   001   011   010   110   111   1 ...

  6. 洛谷 P3955 图书管理员【民间数据】

    P3955 图书管理员[民间数据] 题目背景 数据已再次修正 (既然你们不要前导0我就去掉了) 题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的 ...

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

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

  8. 题解 P5681 【面积【民间数据】】

    讲讲我的做法 分析题意 如果两人的面积一样大怎么办? 然后发现 输出仅一行一个字符串,若正方形面积大则输出 Alice,否则输出 Bob. 所以一样输\(Bob\) 算面积 \(Alice\)的面积就 ...

  9. 2019CSP-J T4 加工零件

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

随机推荐

  1. selenium之浏览器、元素、鼠标等操作总结

    1    控制浏览器 Selenium 主要提供的是操作页面上各种元素的方法,但它也提供了操作浏览器本身的方法,比如浏览器的大小以及浏览器后退.前进按钮等. 1.1  控制浏览器窗口大小 在不同的浏览 ...

  2. 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

  3. React类型检查

    类型检查 import PropTypes from 'prop-types' 类名==List List.propTypes = { list: PropTypes.array } // 默认值 L ...

  4. OLE DB访问接口“MICROSOFT.JET.OLEDB.4.0”配置为在单线程单位模式下运行,所以该访问接口无法用于分布式

    OLE DB访问接口"MICROSOFT.JET.OLEDB.4.0"配置为在单线程单位模式下运行,所以该访问接口无法用于分布式 数据库操作excel时遇到的以上问题的解决方法 解 ...

  5. Babel 配置用法解析

    Babel 配置用法解析 刚复工的时候我司业务太多了,我已不记得我们连续作战了多少天,最近算是有时间可以学习学习我的babel大宝贝了,上周末看了下babel的一些核心模块以及babel的一些配置,今 ...

  6. 7-42 jmu-python-找字符 (15 分)

    输入一个字符串及字符,输出第一次出现该字符的位置. 输入格式: 行1:输入字符串 行2:输入一个字符 输出格式: 找到,输出对应位置,格式index=X的, X表示查找到位置 找不到,输出can't ...

  7. 一些常用的 CSS 技巧和知识点

    作为一名前端工程师,CSS 是必备技能之一,然而在日常开发中,总有那么些时候,面对着炫酷的效果图,脑子里的 CSS 属性却一片空白,于是只能借助搜索引擎,在一堆复杂的介绍中找到需要的内容复制粘贴.有没 ...

  8. h5单页面布局

    前段时间做了一个PC端单页面应用 GitHub因为项目开始的比较仓促,加上本人前端经验特别少,虽然项目大体完成了,但是页面布局确成立它的硬伤...为了填补心里落差,专门做了一个h5的单页面布局,代码很 ...

  9. .NET微服务从0到1:服务注册与发现(Consul)

    目录 Consul搭建 基于Docker搭建Consul 基于Windows搭建Consul ServiceA集成Consul做服务注册 Ocelot集成Consul做服务发现 更多参考 Consul ...

  10. 华为物联网IoT学习笔记目录

    实验准备: 1.<小熊派功能介绍> 2.<小熊派硬件分析> 3.<STM32Cube软件安装介绍> 4.<MDK软件安装介绍> 5.<华为 IoT ...