洛谷 P5663 加工零件
题目传送门
解题思路:
最暴力的做法:
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 加工零件的更多相关文章
- 洛谷 P5663 加工零件 & [NOIP2019普及组] (奇偶最短路)
传送门 解题思路 很容易想到用最短路来解决这一道问题(题解法),因为两个点之间可以互相无限走,所以如果到某个点的最短路是x,那么x+2,x+4也一定能够达到. 但是如何保证这是正确的呢?比如说到某个点 ...
- P5663 加工零件
P5663 加工零件 题解 暴力搜索 搜索显然会TLE #include<iostream> #include<cstdio> #include<cstdlib> ...
- 洛谷P1248 加工生产调度
流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...
- 洛谷P1248 加工生产调度 贪心
正解:贪心 解题报告: 传送门$QwQ$ $umm$直接看可能比较难想,可以先考虑另一个题? 有$n$个小怪,每打一只小怪会扣$a_i$的血,打完之后会回升$b_i$的血,问至少要多少血量才能使全程血 ...
- P5663 加工零件 题解
原题链接 简要题意: 给定一个图,每次询问从 \(x\) 节点开始,\(y\) 步能不能达到 \(1\) 号节点. 算法一 这也是我本人考场算法.就是 深搜 . 因为你会发现,如果 \(x\) 用 \ ...
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- 洛谷P3655 差分数组 树状数组
题目链接:https://www.luogu.org/problemnew/show/P3655 不一定对,仅供参考,不喜勿喷,不喜勿喷. 先copy洛谷P3368 [模板]树状数组 2 题解里面一位 ...
- [洛谷P2365] 任务安排
洛谷题目链接:任务安排 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不得改变),这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务单独完成所需的时 ...
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
随机推荐
- PyCharm配置TensorFlow开发环境
Anaconda自带的Jupyter Notebook很方便,但是执行速度较慢,缺少调试环境.PyCharm与Jupyter Notebook相比,执行速度更快,而且提供了类似Matlab的调试工具, ...
- springboot官网->pom.xml文件
springboot 2.1.6 pom.xml
- 我的Grunt之旅-初识gruntfile文件
时间:2018-03-06 18:23 事件:配置 gruntfile.js文件 首先,回忆一下之前的点,grunt项目下面必须有两个文件 ,第一个 package.json ,第二个 Gru ...
- tools.windows.bat#批处理
关于%~ %~I - 删除任何引号("),扩展 %I %~fI - 将 %I 扩展到一个完全合格的路径名 %~dI - 仅将 %I 扩展到一个驱动器号 %~pI - 仅将 %I 扩展到一个路 ...
- Android框架模式
参考大佬写的文章:https://www.jianshu.com/p/f17f5d981de7 1.MVC模式 Model:模型层,负责处理数据的加载或存储 View:视图层,负责界面数据的展示,与和 ...
- makecert 制作数字证书 给DLL加一个数字签名
声明:文章整理自互联网 我仅需要给dll添加(替换)一个签名,所以我只看了第一步和第三步,其余的部分我没有测试,不能保证内容的是否正确. 看了很多关于DLL加签名的教程 大多是错误的 完全无法正常走下 ...
- GDI4
前几篇我已经向大家介绍了如何使用GDI+来绘图,并做了一个截图的实例,这篇我向大家介绍下如何来做一个类似windows画图的工具.个人认为如果想做一个功能强大的绘图工具,那么单纯掌握GDI还远远不够, ...
- 安卓平分位置layout_weight学习记录
weight (权重) 使用把layout_width写成0 weight 为平分剩余父容器位置 两个标签平分 <?xml version="1.0" encoding ...
- Ubuntu 1804 进入紧急模式
进入系统引导前,长按shift键: 选择第一条,按e进入编辑 添加完成后,只需按下 CTRL+x 或 F10 即可继续启动救援模式 接下来,输入以下命令将根 (/) 文 ...
- JuJu团队11月30号工作汇报
JuJu团队11月30号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 于达 提供类似generator的数据产生接口 改进代码 对julia不够熟悉 婷婷 和队友一起 ...