P5663 加工零件

题解

暴力搜索

搜索显然会TLE

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=1e5+;
struct node{
int to,nxt;
}edge[maxn*];
int head[maxn],cnt=;
int n,m,q;
bool vis[maxn];//节点i是否与1直接相连
int son[][];
int num[]; void addedge(int u,int v)
{
edge[++cnt].to =v;edge[cnt].nxt =head[u];head[u]=cnt;
edge[++cnt].to =u;edge[cnt].nxt =head[v];head[v]=cnt;
} void dfs(int sum,int u)
{
if(sum<) return;
if(num[]==) return;
for(int v,i=;i<=son[u][];i++){
v=son[u][i];
num[v]=min(num[v],sum);
dfs(sum-,v);
}
} int main()
{
n=read();m=read();q=read();
vis[]=;
for(int u,v,i=;i<=m;i++){
u=read();v=read();
if(u==) vis[v]=;
if(v==) vis[u]=;
son[u][++son[u][]]=v;
son[v][++son[v][]]=u;
addedge(u,v);
addedge(v,u);
}
for(int a,l,t=;t<=q;t++){
memset(num,,sizeof(num));
a=read();l=read();
if(l==){
if(a==||(!vis[a])) {
printf("No\n");
continue;
}
else if(vis[a]&&a!=) {
printf("Yes\n");
continue;
}
}else{
num[a]=l;
dfs(l-,a);
if(num[]==) printf("Yes\n");
else printf("No\n");
}
}
return ;
}

暴力搜索 40pt

考虑正解 SPFA最短路

题目给出一张无向图,他大概长这个亚子

对于给出一个点 a 要完成第  L  阶段任务,也就是从 a 到 1 找一条长度为 L 的路径

我们发现

1.  点2到1的距离为1(奇数),如果2完成奇数阶段任务,那么1就要为它提供原料,如果是偶数阶段任务就不用

2.  点5到点1的距离为2(偶数),如果5完成偶数阶段任务,那么1就要为它提供原料,如果是奇数阶段任务就不用

如果2到1的距离是5,也就是大于他们之间最短距离,那么要完成的阶段就会在二者之间不断传递(2-->5  , 1-->4 , 2-->3  , 1-->2  , ....),最后会变成上面分析的情况1

也就是说

1.  如果点a要完成的任务阶段数大于等于他们之间的最短距离,都可以化简成处理他们之间的最短距离来做

2.  如果a要完成的任务阶段数本就小于他们之间的最短距离,也就是a在扩展到1之前就已经有别的点为它提供原料,1节点自然不用提供原料

我们现在就要考虑上面说的第一种情况 L >= dis(a-->1)

由于从一个节点出发到达1会有很多路径,我们用 dis[ i ][ 0 ] 记录从节点 i 到节点 的长度为偶数的最短路的长度,用 dis[ i ][ 1 ] 记录从节点 到节点 的长度为奇数最短路的长度,SPFA 具体实现

更新数组的柿子也就是:

dis[ v ][ 0 ] = min ( dis[ v ][ 0 ] , dis[ u ][ 1 ] + 1 )

dis[ v ][ 1 ] = min ( dis[ v ][ 1 ] , dis[ u ][ 0 ] + 1 )

综上分析得出结论

1.  点 a 要完成的阶段任务数为偶数, 如果从a-->1存在一条偶数最短路,并且它的长度小于等于该任务数,1需要提供原料

2.  点 a 要完成的阶段任务数为奇数, 如果从a-->1存在一条奇数最短路,并且它的长度小于等于该任务数,1需要提供原料

3.  其余情况就不用1提供原料了

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} const int maxn=1e5+;
int n,m,qus; struct node{
int to,nxt;
}edge[maxn<<];
int cnt=,head[maxn];
inline void addedge(int u,int v)
{
edge[++cnt].to =v,edge[cnt].nxt =head[u],head[u]=cnt;
edge[++cnt].to =u,edge[cnt].nxt =head[v],head[v]=cnt;
} int dis[maxn][];
bool vis[maxn]; inline void spfa()
{
queue<int>q;
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
dis[][]=;
vis[]=;
q.push();
while(!q.empty() ){
int u=q.front() ;
q.pop() ;
vis[u]=;
for(int v,i=head[u];i;i=edge[i].nxt ){
v=edge[i].to ;
if(dis[v][]>dis[u][]+){
dis[v][]=dis[u][]+;
if(!vis[v]){
q.push(v);
vis[v]=;
}
}
if(dis[v][]>dis[u][]+){
dis[v][]=dis[u][]+;
if(!vis[v]){
q.push(v);
vis[v]=;
}
}
}
}
} int main()
{
n=read();m=read();qus=read();
for(int u,v,i=;i<=m;i++){
u=read();v=read();
addedge(u,v);
}
spfa();
for(int a,l,i=;i<=qus;i++){
a=read();l=read();
if((l%)&&(dis[a][]<=l))printf("Yes\n");
else if((l%==)&&(dis[a][]<=l))printf("Yes\n");
else printf("No\n");
}
return ;
}

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

  1. 洛谷 P5663 加工零件

    题目传送门 解题思路: 最暴力的做法: bfs模拟,每次将一个阶段的所有点拿出来,将其所有直连的点都放进队列,知道本阶段结束,最后看1号点会不会在最后一个阶段被放入队列.(洛谷数据40分) 优化了一下 ...

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

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

  3. P5663 加工零件 题解

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

  4. 题解 P5663 【加工零件【民间数据】】

    博客园体验更佳 讲讲我的做法 确定做法 首先,看到这道题,我直接想到的是递归,于是复杂度就上天了,考虑最短路. 如何用最短路 首先,看一张图 我们该如何解决问题? 问题:\(3\)做\(5\)阶段的零 ...

  5. 2019CSP-J T4 加工零件

    题目描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇.工厂里有 n 位工人,工人们从 1 ∼n 编号.某些工人之间存在双向的零件传送带.保证每两名工人之间最多只存在一 ...

  6. 题解 CSP2019-J2T4【加工零件】

    这题我们要求的是啥呢?仔细读题可以发现,工人传送带的关系可以看成一个 \(n\) 个点和 \(m\) 条边的无向图,然后对于每组询问 \((a,L)\),其实就是问: \(1\) 到 \(a\) 有没 ...

  7. CSP-J2019 加工零件

    Background: 之前 $noip $死了,泥萌都说 \(noip SPFA\) 了,现在 \(noip\) 复活了,所以 \(SPFA\) 也复活了. (注:这里的 \(noip\) 跟 \( ...

  8. 基础篇:3.2)规范化:3d零件建模

    本章目的:规范化零件建模,这是机械的基本功夫. 1.建模的总体原则和总体要求 1.1 建模总体原则 a)零件模型应能准确表达零件的设计信息:b)零件模型包含零件的几何要素.约束要素和工程要素:c)零件 ...

  9. 2019年CPS-J复赛题解

    题目涉及算法: 数字游戏:字符串入门题: 公交换乘:模拟: 纪念品:完全背包: 数字游戏:广搜/最短路. 数字游戏 题目链接:https://www.luogu.com.cn/problem/P566 ...

随机推荐

  1. linux防火墙扩展模块实战(二)

    iptables扩展模块    扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效 查看帮助 man iptables-extensions (1)隐式扩展 ...

  2. django 配置文件settings.py 设置模板

    INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'dj ...

  3. Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

    联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...

  4. 日常2018/4/9---b/s和c/s架构分别是什么?区别?

    b/s和c/s架构分别是什么?区别? b/s是指前后端分别是 Browser/Server的模式.(3层c/s模式) c/s是指前后端分别是 Client/Server的模式.(2层c/s模式) c/ ...

  5. webpack 配置react脚手架(六):api

    1 访问网址 https://cnodejs.org/api 可以调取api 2.//该body-parser 可以将请求的body数据,转变成 json 格式数据://express-session ...

  6. 通过trace分析优化器如何选择执行计划

    1. mysql> show variables like "optimizer_trace%"\G;*************************** 1. row * ...

  7. 【xsy1301】 原题的价值 组合数+斯特林数+FFT

    题目大意:求$n\times2^{\frac{(n-1)(n-2)/2}{2}}\sum\limits_{i=0}^{n-1}\dbinom{n-1}{i}i^k$ 数据范围:$n≤10^9$,$k≤ ...

  8. mysql中删除重复数据

    //首先我们需要知道我们重复的都有哪些数据, //第一步:进行对数据表进行分组,group by. //第二步:进行后通过having进行限制筛选,条数大于等于2的 //第三步:进行多表删除. //案 ...

  9. 函数指针,使用qsort,进行结构体排序

    #include <stdio.h> #include <stdlib.h> #define STU_NAME_LEN 16 /*学生信息*/ typedef struct s ...

  10. [bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)

    题目描述 CirnoCirnoCirno发现了一种bakabakabaka数,这种数呢只含有222和999两种数字 现在CirnoCirnoCirno想知道[L,R][L,R][L,R]中有多少个数能 ...