P5663 [CSP-J2019] 加工零件 题解
lijingshu_304775 · · 题解
原题链接:https://www.luogu.com.cn/problem/P5663。
更好的使用方式:https://www.luogu.com.cn/article/0o6pvn64。
警告:严禁抄袭。
分析
此题是一道图论的题目,可以将每个工人看成一个点,将双向的零件传送带看作无向边。
只管的做法是按照题目的描述规则,使用递归直接模拟,这样可以通过前
通过样例
由此可得,只需预处理出
AC 代码
#include<bits/stdc++.h>
using namespace std;
int n, m, Q;
//g[i] 存储所有与i相连的点
vector<int> g[100005];
//odd[i]:从1到i的最短奇数路径的长度
//even[i]:从1到i的最短偶数数路径的长度
int odd[100005], even[100005];
queue<int> q;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m >> Q;
for(int i = 1;i <= m;i++){
int u, v;
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
memset(odd, 0x3f, sizeof(odd));
memset(even, 0x3f, sizeof(even));
even[1] = 0;
q.push(1);
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = 0;i < g[u].size();i++){
int v = g[u][i];
//u->i
bool flag = false;// 是否有优化
if(odd[u] + 1 < even[v]){
even[v] = odd[u] + 1;
flag = true;
}
if(even[u] + 1 < odd[v]){
odd[v] = even[u] + 1;
flag = true;
}
if(flag)
q.push(v);
}
}
for(int i = 1;i <= Q;i++){
int a, L;
cin >> a >> L;
if(L % 2 == 0 && even[a] <= L)
cout << "Yes" << endl;
else if(L % 2 == 1 && odd[a] <= L)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}
AC 记录:https://www.luogu.com.cn/record/197005888。