加工零件:非常好的一道图论题。CCF 普及组的题目大概也只有图论出的比较巧妙了。

题意简述:给你一张无向图,\(q\) 次询问,判断是否存在一条从 \(a\) 到 \(1\) 且长度为 \(L\) 的路径。

看到 \(L\) 很大,我们立刻想到了要撇开 \(L\) 的限制思考问题。

首先,对于一条路径,我们肯定能找到从 \(1\) 到 \(v\) 的一条最短路径,它的长度为 \(s\)。

此时我们可以发现,这时候我们一定可以找到长度为 \(s,s+2,s+4,...,s+2k\) 的路径。

为什么?因为这张图是无向图,我们可以沿着一条边走,来回一趟,这样我们的时间就会增加 \(2\) 了。

那么假设我们要 \(s+1,s+3,...,s+2k+1\) 的长度怎么办?我们只需要找到一个长度为 \(s+2k+1\) 的最短路径即可,这样长度为 \(s+2k+1+2j\) 的路径就都能找到。

这就启发我们把一个点分为此时时间为奇数和此时时间为偶数两种了。

我们可以把点翻倍,然后 BFS 的过程中记录此时是奇数路径还是偶数路径,进入到相应状态的点中,每个点的每个状态最多只会走到一次,这样就能在 \(O(n)\) 内求解了。这便是分层图最短路的一个简单应用。

那么每次询问怎么处理?显然,当 \(L\) 为奇数时,判断它是否大于等于奇数状态的这个点的最短路长度。若是,则说明可以,否则说明到不了。因为他们模 \(2\) 的值相同,而我们可以重复走一条边来让距离增加 \(2\)。偶数同理。

写代码的时候把 bitset 两维弄反了,喜提 RE,竟然还把样例过掉了,离谱 CCF。

注意 bitset 尖括号里的那一维是最后一维!!!进食厚仁!!!

代码:

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
int n,m,t,dis[1000005][2];
vector<int>g[1000005];
struct node{
int u,s,d;
};
queue<node>q;
bitset<2>vis[1000005];
void init()
{
memset(dis,0x3f,sizeof(dis));
dis[1][0]=0;
vis[1][0]=1;
q.push({1,0,0});
while(!q.empty())
{
node tmp=q.front();
int u=tmp.u,s=tmp.s,d=tmp.d,ns=(s+1)%2;
q.pop();
for(auto v:g[u])
{
if(vis[v][ns]==0)
{
vis[v][ns]=1;
dis[v][ns]=d+1;
q.push({v,ns,d+1});
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>t;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
init();
while(t--)
{
int a,l;
cin>>a>>l;
if(l%2==1)
{
if(dis[a][1]<=l)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
if(dis[a][0]<=l)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
return 0;
}

Luogu P5663 CSP-J2019 加工零件 题解 [ 绿 ] [ 分层图最短路 ]的更多相关文章

  1. 【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)

    [题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是\(O(n^2)\)的过不去 然而我们有一个优化的办法,可以建一个新图\(G=( ...

  2. P5663 加工零件 题解

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

  3. BZOJ 2763 飞行路线(分层图最短路)题解

    题意:中文题意不解释... 思路:分层图最短路,我们再开一维用来表示当前用了多少次免费次数,dis[i][j]就表示到达i点用了j次免费的最短路,有点DP的感觉. 当个模板用 参考:分层图最短路 代码 ...

  4. 【学习笔记/题解】分层图/[JLOI2011]飞行路线

    题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...

  5. P5663 加工零件

    P5663 加工零件 题解 暴力搜索 搜索显然会TLE #include<iostream> #include<cstdio> #include<cstdlib> ...

  6. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  7. 【luogu P1268 树的重量】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1268 给定所有点间的最短路求原图所有路径和 形如: 我们需要计算红边+绿边 绿边 = (红边+蓝边+紫边)/ ...

  8. 【luogu P1073 最优贸易】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1073 对于状态量相互影响的题目,分层图是个不错的想法. 考虑在题目中分为: 不交易: 直接从1到n出去,为0 ...

  9. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  10. 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)

    次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...

随机推荐

  1. nvm node版本管理

    1.说明 NVM是NODE JS的版本管理工具,可以安装nodejs切换nodejs版本. 2.安装NVM https://github.com/coreybutler/nvm-windows/rel ...

  2. MarkDown文档的编写

    MarkDown的基本语法 MarkDown的标题语法  通过#进行创建标题,#的数量控制标题的级别 MarkDown的段落语法  通过空白行将一行或者多行文本进行分隔 MarkDown的强调语法 粗 ...

  3. Flutter 错误The argument type 'Color' can't be assigned to the parameter type 'MaterialStateProperty<Color?>?'.dart(argument_type_not_assignable)

    MaterialStateProperty<Color?>?和Color 当为TextButton等button添加颜色时,使用ButtonStyle为其添加颜色 TextButton( ...

  4. [solon]Solon开发实战之权限认证

    本项目采用权限认证框架sa-token(sa-token-solon-plugin) pom.xml <!-- 鉴权--> <dependency> <groupId&g ...

  5. Qt/C++音视频开发54-视频监控控件的极致设计

    一.前言 跌跌撞撞摸爬滚打一步步迭代完善到今天,这个视频监控控件的设计,在现阶段水平上个人认为是做的最棒的(稍微自恋一下),理论上来说应该可以用5年不用推翻重写,推翻重写当然也是程序员爱干的事情,这个 ...

  6. Qt开发经验小技巧211-215

    QMainWindow 在对停靠窗体进行排列的时候,有些不常用的设置容易遗忘,建议将 QMainWindow 的头文件函数过一遍一目了然. //设置停靠参数,不允许重叠,只允许拖动 this-> ...

  7. POST、GET、@RequestBody和@RequestParam区别

    参考链接: 1.POST.GET.@RequestBody和@RequestParam区别 2.@RequestBody的使用

  8. Redis 源码简洁剖析 14 - Redis 持久化

    Redis 持久化方式 RDB 优势 劣势 AOF 优势 劣势 Redis < 7.0 参考链接 Redis 源码简洁剖析系列 Redis 持久化方式 主要参考 Redis 官方文档:Redis ...

  9. Django_使用汇总(1)

    使用django(4.1.5) 搭建股票信息后台,显示股票信息: Stock -> models.py class Stock(models.Model): symbol = models.Ch ...

  10. 2021 年万圣节 Github 彩蛋

    记录每年 Github 万圣节彩蛋,也记录有来项目成长历程. 2021 万圣节彩蛋 2020 万圣节彩蛋