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 到节点 1 的长度为偶数的最短路的长度,用 dis[ i ][ 1 ] 记录从节点 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. redo log和bin log

    讲redolog和binlog之前,先要讲一下一条mysql语句的执行过程. 1.client的写请求到达连接器,连接器负责管理连接.验证权限: 2.然后是分析器,负责复习语法,如果这条语句有执行过, ...

  2. 异常-Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=hdfs, access=WRITE, inode="/hbase":root:supergroup:drwxr-xr-x

    1 详细异常 Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlExce ...

  3. C# 调用cmd执行命令

    private void CmdRun_Click(object sender, EventArgs e)        {            Process p = new Process(); ...

  4. mysql - 所有笔记

    # 编码: 1. 查看创建数据库时设置的编码格式: shwo create database 数据库名; 2. 查看创建表时所设置的 编码格式 和 字段详细 show create table 表名; ...

  5. Copy Books

    Description Given n books and the i-th book has pages[i] pages. There are k persons to copy these bo ...

  6. spring-定时任务<task:scheduled-tasks>

    Spring内部有一个task是Spring自带的一个设定时间自动任务调度,提供了两种方式进行配置,一种是注解的方式,而另外一种就是XML配置方式了.注解方式比较简洁,XML配置方式相对而言有些繁琐, ...

  7. Docker 学习10 Docker的系统资源限制及验证

    一.资源限制 二.内存限制 1.OOME 每一个进程都会有oom_adj(oom计算分数的权重)值,此值越大,oom_score(oom得分)越高,越容易被干掉,因此非常非常重要的容器化应用,一开始就 ...

  8. asp.net利用webuploader实现超大文件分片上传、断点续传

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  9. splay 1296 营业额统计

    有一个点超时,确实是个很简单的splay#include<cstdio> #include<iostream> using namespace std; int n,shu[1 ...

  10. iptables防火墙--------基本操作

    查看规则 查看filter表中的规则 $ iptables -t filter -L 使用-t选项,指定要操作的表.使用-L 选项,查看-t选项对应表的规则,-L 选项的意思是,列出规则. ps : ...