博客园体验更佳

讲讲我的做法

确定做法

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

如何用最短路

首先,看一张图

我们该如何解决问题?

问题:\(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\)实现的最短路

  1. void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
  2. memset(ji,0x3f,sizeof(ji));//奇数最短路径
  3. memset(ou,0x3f,sizeof(ou));//偶数最短路径
  4. queue<pair<int,int> >q;
  5. q.push(make_pair(1,0));
  6. ou[1]=0;
  7. while(q.size()){
  8. int x=q.front().first,y=q.front().second;
  9. for(int i=0;i<v[x].size();i++){
  10. if(y%2==1){//奇数+1=偶数
  11. if(y+1<ou[v[x][i]]){
  12. ou[v[x][i]]=y+1;//更新答案
  13. q.push(make_pair(v[x][i],y+1));
  14. }
  15. }else{//偶数+1=奇数
  16. if(y+1<ji[v[x][i]]){
  17. ji[v[x][i]]=y+1;//更新答案
  18. q.push(make_pair(v[x][i],y+1));
  19. }
  20. }
  21. }
  22. q.pop();
  23. }
  24. }

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

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

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

  1. void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
  2. memset(ji,0x3f,sizeof(ji));//奇数最短路径
  3. memset(ou,0x3f,sizeof(ou));//偶数最短路径
  4. queue<pair<int,int> >q;
  5. for(int i=0;i<v[1].size();i++){
  6. ji[v[1][i]]=1;
  7. q.push(make_pair(v[1][i],1));
  8. }
  9. while(q.size()){
  10. int x=q.front().first,y=q.front().second;
  11. for(int i=0;i<v[x].size();i++){
  12. if(y%2==1){//奇数+1=偶数
  13. if(y+1<ou[v[x][i]]){
  14. ou[v[x][i]]=y+1;//更新答案
  15. q.push(make_pair(v[x][i],y+1));
  16. }
  17. }else{//偶数+1=奇数
  18. if(y+1<ji[v[x][i]]){
  19. ji[v[x][i]]=y+1;//更新答案
  20. q.push(make_pair(v[x][i],y+1));
  21. }
  22. }
  23. }
  24. q.pop();
  25. }
  26. }

简要讲解主程序

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

  1. int main(){
  2. int n,m,q;
  3. read(n);read(m);read(q);
  4. for(int i=1;i<=m;i++){
  5. int x,y;
  6. read(x);read(y);//无向边
  7. v[x].push_back(y);//连边
  8. v[y].push_back(x);//连边
  9. }
  10. bfw();//跑最短路
  11. while(q--){
  12. int x,y;
  13. read(x);read(y);
  14. if(y%2==0){
  15. if(ou[x]>y)puts("No");//如果大于就不可能了
  16. else puts("Yes");
  17. }else{
  18. if(ji[x]>y)puts("No");//如果大于就不可能了
  19. else puts("Yes");
  20. }
  21. }
  22. return 0;
  23. }

总结

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. template<typename T>inline void read(T &FF){
  4. T RR=1;FF=0;char CH=getchar();
  5. for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
  6. for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
  7. FF*=RR;
  8. }
  9. template<typename T>void write(T x){
  10. if(x<0)putchar('-'),x*=-1;
  11. if(x>9)write(x/10);
  12. putchar(x%10+48);
  13. }
  14. vector<int>v[100010];
  15. int ji[100010],ou[100010];
  16. void bfw(){//我有一个好朋友叫bfw,所以我写bfs时,喜欢把函数名起为bfw
  17. memset(ji,0x3f,sizeof(ji));//奇数最短路径
  18. memset(ou,0x3f,sizeof(ou));//偶数最短路径
  19. queue<pair<int,int> >q;
  20. for(int i=0;i<v[1].size();i++){
  21. ji[v[1][i]]=1;
  22. q.push(make_pair(v[1][i],1));
  23. }
  24. while(q.size()){
  25. int x=q.front().first,y=q.front().second;
  26. for(int i=0;i<v[x].size();i++){
  27. if(y%2==1){//奇数+1=偶数
  28. if(y+1<ou[v[x][i]]){
  29. ou[v[x][i]]=y+1;//更新答案
  30. q.push(make_pair(v[x][i],y+1));
  31. }
  32. }else{//偶数+1=奇数
  33. if(y+1<ji[v[x][i]]){
  34. ji[v[x][i]]=y+1;//更新答案
  35. q.push(make_pair(v[x][i],y+1));
  36. }
  37. }
  38. }
  39. q.pop();
  40. }
  41. }
  42. int main(){
  43. int n,m,q;
  44. read(n);read(m);read(q);
  45. for(int i=1;i<=m;i++){
  46. int x,y;
  47. read(x);read(y);//无向边
  48. v[x].push_back(y);//连边
  49. v[y].push_back(x);//连边
  50. }
  51. bfw();//跑最短路
  52. while(q--){
  53. int x,y;
  54. read(x);read(y);
  55. if(y%2==0){
  56. if(ou[x]>y)puts("No");//如果大于就不可能了
  57. else puts("Yes");
  58. }else{
  59. if(ji[x]>y)puts("No");//如果大于就不可能了
  60. else puts("Yes");
  61. }
  62. }
  63. return 0;
  64. }

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

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

题解 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. Python Mock 的入门

    Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...

  2. github hexo配置踩过的坑

    大体步骤:配置npm,在github中增加自己的sshkey. 多sshkey的话在用户主目录的.ssh中要配置好. 删除仓库里面 source/_posts/我的文章.md 执行下面命令更新博客 h ...

  3. Visual studio2019配置OPENCV 时属性管理器中没有Microsoft.Cpp.x64.user的解决办法

    方法一:重新下载Visual studio2017,再次打开2019就会出现Microsoft.Cpp.x64.user,感觉有些麻烦,也占电脑空间,推荐方法二. 方法二:与方法一原理相同,下载201 ...

  4. php-fpm启动失败处理

    报错信息: No pool defined. at least one pool section must be specified in config file [11-Mar-2019 23:57 ...

  5. 前端每日实战:17# 视频演示如何用纯 CSS 创作炫酷的同心矩形旋转动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教程 此视频 ...

  6. Centos7 U盘安装

    以下内容来自 https://www.cnblogs.com/Hello-java/p/8628917.html 和 https://blog.csdn.net/fiiber/article/deta ...

  7. Promise,Generator,Await/Async

    上节中忘记讲:Iterator接口和Generator函数的关系了,Symbol.iterator方法的最简单的实现就是通过Generator函数: let myIterable = { [Symbo ...

  8. 使用vue cli3新建一个vue项目

    写在最前 虽然身为一个java后端工作者,前端还是要沾点的,基于vue的火热,所以平常的工作中项目前端基本都是vue.这次就主要讲一讲vue项目的创建,并从vue的安装开始讲起,附带上我之前安装使用时 ...

  9. 7,MapReduce基础

    目录 MapReduce基础 一.关于MapReduce 二.MapReduce的优缺点 三.MapReduce的执行流程 四.编写MapReduce程序 五.MapReduce的主要执行流程 Map ...

  10. PyCharm设置远程虚拟环境

    1. 创建项目 2. 配置解释器 1. 先打开srttings 2. 选择配置解释器选项 3. 配置远端虚拟环境 4. 成功提示 5. 查看pip列表信息 经过以上操作,PyCharm设置远程虚拟环境 ...