https://www.luogu.com.cn/problem/P5663
dijkstra
如果要生成奇数L阶段零件,则必须存在奇数路径 并且L至少要大于等于最短奇数路径
如果要生成偶数L阶段零件,则必须存在偶数路径 并且L至少要大于等于最短偶数路径
分别求一下点1到各个点的最短偶数长度路径和最短奇数长度路径
建两个dist数组和两个vis数组分别保存奇数路径情况和偶数路径情况
#include<bits/stdc++.h>
using namespace std;
using PII = pair<int, int>;
const int N = 1e5 + 10, INF = 0x3f3f3f3f;
int n, m, q;
vector<int> adj[N];
int dis_odd[N], dis_even[N]; // dis_odd 奇数最短路径 dis_even 偶数最短路径
bool vis_odd[N], vis_even[N];
void dijkstra()
{
memset(dis_odd, 0x3f, sizeof dis_odd);
memset(dis_even, 0x3f, sizeof dis_even);
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push({0, 1});
dis_even[1] = 0;
while (!heap.empty())
{
auto dist = heap.top().first, u = heap.top().second;
heap.pop();
if (dist % 2) {
if (vis_odd[u])
continue;
vis_odd[u] = true;
}
else {
if (vis_even[u])
continue;
vis_even[u] = true;
}
for (auto v : adj[u])
{
if (dis_odd[v] > dis_even[u] + 1) // 如果是偶数距离
{
dis_odd[v] = dis_even[u] + 1;
heap.push({dis_odd[v], v});
}
else if (dis_even[v] > dis_odd[u] + 1) // 如果是奇数距离
{
dis_even[v] = dis_odd[u] + 1;
heap.push({dis_even[v], v});
}
}
}
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
cin >> n >> m >> q;
for (int i = 1, u, v; i <= m; i++)
{
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
dijkstra();
for (int i = 1; i <= q; i++)
{
int a, L;
cin >> a >> L;
if (L % 2 != 0 && dis_odd[a] != INF && L >= dis_odd[a])
cout << "Yes" << '\n';
else if (L % 2 == 0 && dis_even[a] != INF && L >= dis_even[a])
cout << "Yes" << '\n';
else
cout << "No" << '\n';
}
return 0;
}