题目传送门

解题思路:

最暴力的做法:

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. java#StringBuffer&StringBuilder

    StringBuffer A thread-safe, mutable sequence of characters. A string buffer is like a String, but ca ...

  2. ahk键盘增强✨✨✨

    ahk键盘增强✨✨✨ ahk的一个键盘增强脚本,仅在winwods下可用,长期更新 仓库链接 首先感谢ahk的大神们,这个工具能极大地增加生产力 功能简介 myahk旨在增强windows下的键盘功能

  3. 010.Oracle数据库 , ORDER BY 按升序降序排序

    /*Oracle数据库查询日期在两者之间*/ SELECT DISTINCT ATA FROM LM_FAULT WHERE ( OCCUR_DATE BETWEEN to_date( '2017-0 ...

  4. 【转】转帖并注释:Java中的事件处理机制--事件监听器的四种实现方式

    原文地址:http://blog.sina.com.cn/s/blog_4b650d650100nqws.html Java中四种事件监听器的实现方式分别为: 自身类做为事件监听器 外部类作为事件监听 ...

  5. leetcode922 Sort Array By Parity II

    """ Given an array A of non-negative integers, half of the integers in A are odd, and ...

  6. c# GlobalAddAtom GlobalDeleteAtom

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. 【剑指Offer】面试题32 - II. 从上到下打印二叉树 II

    题目 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回 ...

  8. 2.11 学习总结 之 ajax

    一.说在前面 昨天 学习了 json 数据结构 今天 学习ajax 并使用 json  二.jquery的ajax操作 1.查询jquery的官方文档发现与ajax相关的jquey方法如下: 1)$. ...

  9. POJ 1655:Balancing Act

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10311   Accepted: 4261 De ...

  10. 抓取屏幕并压缩生成HBITMAP

    HBITMAP GetScreenBmp() { HWND hwnd = ::GetDesktopWindow(); HDC hsrc = ::GetDC(hwnd); HDC hmemdc = :: ...