题目传送门

解题思路:

最暴力的做法:

bfs模拟,每次将一个阶段的所有点拿出来,将其所有直连的点都放进队列,知道本阶段结束,最后看1号点会不会在最后一个阶段被放入队列.(洛谷数据40分)

优化了一下代码:

上面的做法我用了两个队列,发现代码可以优化一下,用一个队列.(洛谷数据55分).

正解:

对于一个点,如果它加工的零件是偶数阶段,则在一定范围内与它偶数距离的点都要提供原料.

对于一个点,如果它加工的零件是奇数阶段,则在一定范围内与它奇数距离的点都要提供原料.

那么这个一定范围是多少呢?

就是小于等于这个点加工阶段大小的范围.

代码:

 #include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue> using namespace std; int n,m,qq,x,y;
bool vis[];
queue<int> q,q1;
struct kkk{
vector<int > a;
int len;
}e[]; inline void solve() {
int id,s;
scanf("%d%d",&id,&s);
memset(vis,,sizeof(vis));
while(!q.empty()) q.pop();
while(!q1.empty()) q1.pop();
q.push(id);
vis[id] = ;
while(s--) {
while(!q.empty()) {
int v = q.front();
q.pop();
vis[v] = ;
if(e[v].len != )
for(int i = ;i < e[v].len; i++)
q1.push(e[v].a[i]);
}
while(!q1.empty()) {
int ee = q1.front();
vis[ee] = ;
q1.pop();
q.push(ee);
}
}
if(vis[]) printf("Yes\n");
else printf("No\n");
} int main() {
scanf("%d%d%d",&n,&m,&qq);
for(int i = ;i <= n; i++)
e[i].len = ;
for(int i = ;i <= m; i++) {
scanf("%d%d",&x,&y);
e[x].len++;e[y].len++;
e[x].a.push_back(y);
e[y].a.push_back(x);
}
for(int i = ;i <= qq; i++)
solve();
return ;
}

最暴力的做法

 #include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue> using namespace std; int n,m,qq,x,y;
bool vis[];
queue<int> q;
struct kkk{
vector<int > a;
int len;
}e[]; inline void solve() {
int id,s;
scanf("%d%d",&id,&s);
memset(vis,,sizeof(vis));
while(!q.empty()) q.pop();
q.push(id);
vis[id] = ;
while(s--) {
int u = q.size();
for(int i = ;i <= u; i++) {
int v = q.front();
q.pop();
vis[v] = ;
if(e[v].len != )
for(int i = ;i < e[v].len; i++) {
if(vis[e[v].a[i]]) continue;
q.push(e[v].a[i]);
vis[e[v].a[i]] = ;
}
}
}
if(vis[]) printf("Yes\n");
else printf("No\n");
} int main() {
scanf("%d%d%d",&n,&m,&qq);
for(int i = ;i <= n; i++)
e[i].len = ;
for(int i = ;i <= m; i++) {
scanf("%d%d",&x,&y);
e[x].len++;e[y].len++;
e[x].a.push_back(y);
e[y].a.push_back(x);
}
for(int i = ;i <= qq; i++)
solve();
return ;
}

优化暴力的代码

 #include<iostream>
#include<cstdio>
#include<queue>
#include<cstring> using namespace std; int n,m,qq,head[],ji[],ou[];
bool flag;
struct kkk{
int to,next;
}e[];
int tot;
queue<int> q; inline void add(int x,int y) {
e[++tot].to = y;
e[tot].next = head[x];
head[x] = tot;
} inline void spfa() {
ou[] = ;
q.push();
while(!q.empty()) {
int s = q.front();
q.pop();
for(int i = head[s];i != ; i = e[i].next) {
int t = e[i].to,jv = ji[t],ov = ou[t];
ji[t] = min(ji[t],ou[s] + );//更新奇数最短路
ou[t] = min(ou[t],ji[s] + );//更新偶数最短路
if(jv != ji[t] || ov != ou[t])
q.push(t);
}
}
} int main() {
scanf("%d%d%d",&n,&m,&qq);
for(int i = ;i <= m; i++) {
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
if(y == || x == ) flag = ;
}
memset(ji,0x3f3f,sizeof(ji));
memset(ou,0x3f3f,sizeof(ou));
spfa();
for(int i = ;i <= qq; i++) {
int id,jd;
scanf("%d%d",&id,&jd);
if(!flag) {
printf("No\n");
continue;
}
if(jd % == && ji[id] <= jd) {
printf("Yes\n");
continue;
}
if(jd % == && ou[id] <= jd) {
printf("Yes\n");
continue;
}
printf("No\n");
}
return ;
}

正解

//CSP-J2019 T4

洛谷 P5663 加工零件的更多相关文章

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

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

  2. P5663 加工零件

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

  3. 洛谷P1248 加工生产调度

    流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...

  4. 洛谷P1248 加工生产调度 贪心

    正解:贪心 解题报告: 传送门$QwQ$ $umm$直接看可能比较难想,可以先考虑另一个题? 有$n$个小怪,每打一只小怪会扣$a_i$的血,打完之后会回升$b_i$的血,问至少要多少血量才能使全程血 ...

  5. P5663 加工零件 题解

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

  6. 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山

    前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...

  7. 洛谷P3655 差分数组 树状数组

    题目链接:https://www.luogu.org/problemnew/show/P3655 不一定对,仅供参考,不喜勿喷,不喜勿喷. 先copy洛谷P3368 [模板]树状数组 2 题解里面一位 ...

  8. [洛谷P2365] 任务安排

    洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...

  9. 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]

    题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...

随机推荐

  1. vue - @click 传参删除

    <template>   <div id="app">      <div v-for="todo in  todos" :key ...

  2. LOJ #10002. 喷水装置

    题目 裸的贪心. 基本思想见图: Code: #include<iostream> #include<cstdio> #include<cstring> #incl ...

  3. Docker退出容器不关闭容器的方法

    进入docker容器后如果退出容器,容器就会变成Exited的状态,那么如何退出容器让容器不关闭呢? 如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器,这一点很重要,请牢记! 以下示例为退出 ...

  4. SpringBoot-数据库连接信息配置

    SpringBoot-数据库连接信息配置 SpringBoot-数据库连接信息配置 ​ 在SpringBoot中提供了默认的数据库连接器-追光者HikariCP,我们只需要添加jdbc的启动器就会自动 ...

  5. 吴裕雄--天生自然java开发常用类库学习笔记:多线程基础编程

    class MyThread implements Runnable{ // 实现Runnable接口,作为线程的实现类 private String name ; // 表示线程的名称 public ...

  6. NO4 find&mv-&-特殊符号..和.

    问题七:退到上一级目录,删除data目录. 解答:cd ..或cd ../        rm -r data或rmdir data#空目录就不需要带-rf,杀鸡不用宰牛刀,rmdir基本要淘汰的命令 ...

  7. jrebel插件的激活

    转 jrebel idea插件激活,亲测可用: 在jrebel server处,写上: http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc81 ...

  8. ROS常用库(一) fake_localization

    wiki是最好的学习资料,以下直接参考了wiki官网.另外po出官网网址,建议英语较好的朋友之接看原版 http://wiki.ros.org/fake_localization 概述 fake_lo ...

  9. Spark 内存管理

    Spark 内存管理 Spark 执行应用程序时, 会启动 Driver 和 Executor 两种 JVM 进程 Driver 负责创建 SparkContext 上下文, 提交任务, task的分 ...

  10. torch.cuda.FloatTensor

    Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensor加cuda()函数得到. 一般系统默认是torch.FloatTensor ...