洛谷 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两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
随机推荐
- XmlBeanDefinitionReader
- springboot 中单机 redis 实现分布式锁
在微服务中经常需要使用分布式锁,来执行一些任务.例如定期删除过期数据,在多个服务中只需要一个去执行即可. 以下说明非严格意义的分布式锁,因为 redis 实现严格意义的分布式锁还是比较复杂的,对于日常 ...
- Eclipse 不能调试的问题
现象 弹出 Cannot connect to VM Console 中的输出是: ERROR: transport error 202: connect failed: Connection ref ...
- 二次urldecode注入
原理大多数web程序都会对输入字符进行转换,例如addslashes(),mysql_real_escape_string(),mysql_escape_string(),也就是对单引号',双引号&q ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Set接口
import java.util.HashSet ; import java.util.Set ; public class HashSetDemo01{ public static void mai ...
- c++程序—选择结构
if(判断条件){执行语句} #include<iostream> using namespace std; #include<string> int main() { ; c ...
- 觉醒 闭包/this
两条非常重要的知识点 首先上题 var a = '322' var preview = function() { var a = '123' console.log(a, this, this.a) ...
- java 九数组分数
九数组分数 1,2,3-9 这九个数字组成一个分数,其值恰好为1/3,如何组法? 下面的程序实现了该功能,请填写划线部分缺失的代码. public class A { public static vo ...
- Biu一Biu--GDB
gcc常见编译选项 ** -c **:只激活预处理.编译和汇编,也就是生成obj文件 ** -S **:只激活处理和编译,把文件编译成汇编代码 ** -o **:定制目标名称,缺省的时候编译出来的可执 ...
- 干货分享:常见的留学生Essay写作逻辑结构
任何一种类型的Essay写作都应遵循一种逻辑结构,Long Essay可能在不同部分依据情况使用不同的逻辑结构.本文将为大家分享六种常见留学生Essay写作逻辑结构,为方便阅读本文采用中英文对照方式. ...