首页 > 其他分享 >洛谷P5663 [CSP-J2019] 加工零件

洛谷P5663 [CSP-J2019] 加工零件

时间:2024-08-17 14:54:29浏览次数:9  
标签:P5663 now jdist 洛谷 int ed J2019 inque odist

传送门:P5663 [CSP-J2019] 加工零件

这是一篇写于 2024.8.17 的做题记录,祝稻米朋友们节日快乐。

废话还是少说一点比较好qwq

题目意思:(一个很抽象的东西)

说白了其实就是给你一张无向图,然后有 p 次询问,每次询问给你一个 v 和 L ,问你从 1 号点到 v 号点 有没有 长度为 L 的边。

注意:
  • 每条边是可以重复走的
  • 这是一张无向图
  • 可能会有孤点的情况

思路:

自信满满的开题 qwq
然鹅。。。
不会啊!!!!
瞬间开启自我怀疑状态
翻了翻题解,判断奇偶是什么东西???
于是。。。
思考ing。。。。
终于!

如果 L 与 从点 1 出发到达该点的路径长度 奇偶性一致
换句话说就是:
如果 L 是奇数,并且从 1 号点出发有一条能到达该点的 路径长度为奇数,路径长度 <= L 的边
那么他就需要提供原材料,因为该材料在加工过程中能在相邻两个工人之间来回横跳
偶数情况亦然
所以我们只需要求 1 到所有点的奇数路径 和 偶数路径
看是否有与 L 奇偶性相同的边,且长度<=L
为了保证长度<=L,我们求 1到所有点的奇数最短路偶数最短路
思路明确了就很好写了 QaQ

最终代码:

就跑一个最短路啦
SPFA,启动!

#include<bits/stdc++.h>

using namespace std;

const int maxn=100100;
const int maxm=100100;
 
int m,n,qq;
int en=0;
int fir[maxn];

struct edge{
	int v;
	int next;
}ed[maxm*2];

void add_edge(int u,int v)
{
	en++;
	ed[en].v=v;
	ed[en].next=fir[u];
	fir[u]=en;
}

int jdist[maxn],odist[maxn];
bool inque[maxn];
queue<int> q;

void spfa(int r)
{
	memset(jdist,0x3f3f3f,sizeof(jdist));
	memset(odist,0x3f3f3f,sizeof(odist));
	odist[r]=0;
	q.push(r);
	inque[r]=true;
	while(!q.empty())
	{
		int now=q.front();
		q.pop();
		inque[now]=false;
		for(int i=fir[now];i;i=ed[i].next)
		{
			int v=ed[i].v;
			if(odist[v]>jdist[now]+1||jdist[v]>odist[now]+1){
				jdist[v]=min(jdist[v],odist[now]+1);
				odist[v]=min(odist[v],jdist[now]+1);
				if(!inque[v])
				{
					q.push(v);
					inque[v]=true;
				}
			}
		}
	}
 } 

int main()
{
	cin>>n>>m>>qq;
	for(int i=1;i<=m;i++)
	{
		int u,v;
		cin>>u>>v;
		add_edge(u,v);
		add_edge(v,u);
	}
	spfa(1);
	while(qq--)
	{
		int v,l;
		cin>>v>>l;
		if(l%2==1&&jdist[v]<=l)cout<<"Yes"<<endl;
		else if(l%2==0&&odist[v]<=l)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	 }
	return 0; 
}

后记

  • 因为用的是 SPFA ,孤点的情况对代码运行结果就没有影响了 qwq
  • 这个题目保证了同一个点不会入队两次inque数组其实没用。。时间复杂度为 O(n+q)
  • 最后,对于边权为 1 的图来跑最短路,bfs 的方法也是可行的,复杂度与 spfa 一致

标签:P5663,now,jdist,洛谷,int,ed,J2019,inque,odist
From: https://www.cnblogs.com/lazy-ZJY0307/p/18364396

相关文章

  • 洛谷p1717题解
    题目描述话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽,为了表示安慰和鼓励,VIP999决定请他吃一次“年年大丰收”,为了表示诚意,他还决定亲自去钓鱼。但是,因为还要准备NOIP2013,z老师只给了他 H 个小时的空余时间,假设有 n 个鱼塘都在一条水平路边,从左......
  • 洛谷p2580题解
    题目背景XS中学化学竞赛组教练是一个酷爱炉石的人。他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900)。题目描述这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞......
  • 洛谷——P1102 A-B 数对
    题目背景出题是一件痛苦的事情!相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的A+BProblem,改用A-B了哈哈!题目描述给出一串正整数数列以及一个正整数CCC,......
  • 洛谷——P1093 [NOIP2007 普及组] 奖学金
    题目背景NOIP2007普及组T1题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前555名学生发奖学金。期末,每个学生都有......
  • 洛谷题单指南-常见优化技巧-P2866 [USACO06NOV] Bad Hair Day S
    原题链接:https://www.luogu.com.cn/problem/P2866题意解读:每个牛能看到的右边比他矮的牛,直到有比他高的挡住为止,因此只用找每个牛右边第一个比他高的牛的位置即可计算中间比他矮的有多少。解题思路:典型的单调栈应用,注意,常规的单调栈可以用来:1、找每个数左边第一个比他小的数的......
  • 洛谷题单指南-常见优化技巧-P4147 玉蟾宫
    原题链接:https://www.luogu.com.cn/problem/P4147题意解读:找到一个只包含'F'的最大的子矩形。解题思路:方法1:设R为0,F为1,先计算二维前缀和,再枚举所有子矩形左上角(x1,y1)、右下角(x2,y2),计算子矩形的区间和,更新最大值,只能得到部分分。方法2:对于二维矩阵每个点,定义三个属性:h[][]......
  • 洛谷P1786
    6.帮贡排序题目链接:[P1786帮贡排序-洛谷|计算机科学教育新生态(luogu.com.cn)]()题目背景在absi2011的帮派里,死号偏多。现在absi2011和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。题目描述目前帮派内共最多有一位帮主,......
  • 洛谷P2789 直线交点数 题解
    解题思路考虑将直线分组,每组内直线互相平行,任意两组直线间交点数量等于两组内直线数量乘积。分组操作使用dfs,求出交点数量后加入set去重,输出set大小。时间复杂度O(2NN2)有点鬼畜但是可以通过。实现#include<cstdio>#include<unordered_set>inta[30];std::unordered_set......
  • 洛谷题单指南-常见优化技巧-P1115 最大子段和
    原题链接:https://www.luogu.com.cn/problem/P1115题意解读:最大连续子序列的和。解题思路:DP的做法可参考:https://www.cnblogs.com/jcwy/p/18144124也可以采用双指针来枚举:i从1开始,j=i用j来枚举连续序列,如果已有序列和+下一个a[j]>=下一个a[j],那个j一直++,累加序列和如果出......
  • 可持久化线段————主席树(洛谷p3834)
    洛谷P3834可持久化线段树2问题描述:给定n各整数构成的序列,求指定区间[L,R]内的第k小值(求升序排序后从左往右数第k个整数的数值)输入:第一行输入两个整数n,m,分别代表序列长度n和对序列的m次查询;第二行输入n个整数,表示序列的n个整数;之后的m行,每行输入3个整数L,R,k,表示查询......