解题思路
我们可以发现,如果一个点和其它点连接,那么肯定会有工人a生产第x阶段,b生产x-1阶段,a再生产x-2阶段…即假如一个点需要生产第10阶段的零件,那第8,6,4,2,0阶段的材料都要生产。这样,我们设一个点需要生产x阶段的零件,我们只需要分别求出x为奇数和偶数时的最大值即可。
我们用上述思路找两个最大值,其实换一个角度来说就是求1号点到奇数和偶数的最短路了(bfs即可)。
代码实现
#include <bits/stdc++.h>
const int N = 100005;
using namespace std;
struct edge {
int to, nxt;
} e[N << 1];
int head[N], d[N];
int cnt;
struct node {
int pos, dis;
node() { }
node(int _pos, int _dis) {
pos = _pos;
dis = _dis;
}
};
queue<node> q;
inline void add(int u, int v){
e[++cnt] = {v, head[u]};
head[u] = cnt;
}
int dis1[N], dis2[N];
bool vis1[N], vis2[N];
void bfs(){
memset(dis1, 0x3f, sizeof dis1);
memset(dis2, 0x3f, sizeof dis2);
q.push(node(1, 0));
while (q.size()) {
node u = q.front();
q.pop();
int x = u.pos, d = u.dis + 1;
for (int i = head[x]; i; i = e[i].nxt) {
int v = e[i].to;
if (d < dis1[v] && d % 2 != 0) {
dis1[v] = d;
q.push(node(v, d));
}
if (d < dis2[v] && d % 2 == 0) {
dis2[v] = d;
q.push(node(v, d));
}
}
}
}
int main() {
int n, m, q;
cin >> n >> m >> q;
for (int i = 1; i <= m; ++i) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
++d[u];
++d[v];
}
bfs();
while (q--) {
int a, L;
cin >> a >> L;
if (!d[a] && L) {
cout << "No\n";
continue;
}
if (L % 2 == 0) {
if (L - dis2[a] >= 0) {
cout << "Yes\n";
} else {
cout << "No\n";
}
} else {
if (L - dis1[a] >= 0) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
}
return 0;
}