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. 100行代码打造属于自己的代理ip池

    经常使用爬虫的朋友对代理ip应该比较熟悉,代理ip就是可以模拟一个ip地址去访问某个网站.我们有时候需要爬取某个网站的大量信息时,可能由于我们爬的次数太多导致我们的ip被对方的服务器暂时屏蔽(也就是所 ...

  2. base64码通过http传输 +号变 空格 以及 图片编码后字符串较长导致POST提交失败 问题解决

    场景:图片上传OSS存储,接口拿字符串去接前端传的base64码,服务器打印入参传的值,发现和前端打印的值有所区别,服务器中打印的值所有+号全部变成空格. 解决办法: Java中使用:url = ur ...

  3. c++混合使用不同标准编译潜在的问题

    最近项目使用的C++的版本到C++11了,但是由于有些静态库(.a)没有源码,因此链接时还在使用非C++11版本的库文件.目前跑了几天,似乎是没出什么问题,但是我还是想说一下这样做有哪些潜在的风险. ...

  4. Linux系统用终端打开图片

    一.现在开发多数使用的系统都是linux系统,但有的时候会遇到一些比较麻烦的小问题,比如:在某个文件夹中存入大量的图片时,想要查看某张图片的时候,当你使用图形化显示的时候,就会很卡,所以在这里我针对于 ...

  5. java基础(3)---Scanner键盘输入

    1.使用scanner类: import java.util.Scanner; class ScannerTest{ public static void main( String[] args){ ...

  6. Caused by: java.lang.ClassNotFoundException: org.fusesource.jansi.WindowsAnsiOutputStream

    08:23:18,995 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate append ...

  7. 《hello--world团队》第六次作业:团队项目系统设计改进与详细设计

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十 团队作业6:团队项目系统设计改进与详细设计 团队名称 <hello--wo ...

  8. 28-SQLServer带见证服务器的镜像搭建

    一.注意点 1.数据库的模式要是完整模式. 2.要对数据库完整备份和事务日志备份,分别还原到镜像库上,使用NORECOVERY模式. 3.镜像数据库是不允许删除和操作,即便查看属性也不行. 4.先删除 ...

  9. [Javascript] Construct a Regex to Match Twitter Mentions with Regexr

    regexr is a powerful tool for debugging existing regexes and creating new ones. In this lesson, we'l ...

  10. spark读HFile对hbase表数据进行分析

    要求:计算hasgj表,计算每天新增mac数量. 因为spark直接扫描hbase表,对hbase集群访问量太大,给集群造成压力,这里考虑用spark读取HFile进行数据分析. 1.建立hasgj表 ...