题目传送门

解题思路:

最暴力的做法:

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. Noip2018普及组初赛试题解题报告

    解题思路: 一.单项选择题 (答案:DDDBBAAAABABBBB) 1.除D外,其余均为输入设备. 2.除D外,其余都等于(617)10 ,D选项为(619)10. 3.1MB=1024KB=102 ...

  2. 07.Delphi接口的生命周期

    在Delphi的接口中,是不需要释放的,调用完之后,接口的生命周期就结束了,如下面的例子 unit mtReaper; interface type // 定义一个接口 IBase = interfa ...

  3. java注解——内置注解和四种元注解

    java内置注解: @Override(重写方法):被用于标注方法,用于说明所标注的方法是重写父类的方法 @Deprecated(过时方法):用于说明所标注元素,因存在安全问题或有更好选择而不鼓励使用 ...

  4. go_http

    httpSvr // HandleFunc registers the handler function for the given pattern // in the DefaultServeMux ...

  5. thinkphp调用sqlserver储存过程返回多个结果集

    首先安装扩展 windows 分为两个步骤 找到对应自己PHP版本的pdo扩展,下载解压出来,并且在php.ini里面启用扩展,需要注意的问题是php版本以及是否为安全版本 下载 ODBC Drive ...

  6. 《新标准C++程序设计》3.8(C++学习笔记10)

    友元 友元分为友元函数和友元类两种. 一.友元函数 在定义一个类的时候,可以把一些函数(包括全局函数和其它类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对 ...

  7. webpack4-1.常见配置

    参看:文档地址 视频地址:https://www.bilibili.com/video/av51693431 webpack的作用:代码转换.文件优化.代码分割.模块管理.自动刷新.代码检验.自动发布 ...

  8. ServletContext 详解

    ServletContext——它是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext ...

  9. 复选框全选、反选及根据值JS控制复选框默认选中事件

    HTML代码 <div class="col-sm-7"> <input type="checkbox" id="allAndNot ...

  10. bool之regexp正则注入(原理详解)

    感谢原创博主的文章,在此致敬.本文转自:http://www.cnblogs.com/lcamry/articles/5717442.html 我们都已经知道,在MYSQL 5+中 informati ...