用BFS处理最短路全对,用Dijkstra会TLE最后四个点
#include <bits/stdc++.h>
#define mkpr make_pair
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e5 + 7;
const int inf = 0x3f3f3f3f;
int n, m, T;
vector<int> e[maxn];
int dis[maxn][2];
struct node{
int u, dis;
bool operator<(const node& a) const{
return this -> dis < a.dis;
}
};
priority_queue<node> q;
void Dijkstra() {
memset(dis, inf, sizeof(dis));
dis[1][0] = 0;
q.push(node{1, 0});
while (!q.empty()) {
int u = q.top().u;
int d = q.top().dis;
q.pop();
for (int v : e[u]) {
if (d & 1) {
if (d + 1 < dis[v][0])
dis[v][0] = d + 1, q.push(node{v, d + 1});
} else {
if (d + 1 < dis[v][1])
dis[v][1] = d + 1, q.push(node{v, d + 1});
}
}
}
}
int main() {
scanf("%d%d%d", &n, &m, &T);
for (int i = 1; i <= m; ++i) {
int u, v;
scanf("%d%d", &u, &v);
e[u].push_back(v);
e[v].push_back(u);
}
Dijkstra();
while (T--) {
int a, L;
scanf("%d%d", &a, &L);
if (L & 1) {
if (dis[a][1] > L) printf("No\n");
else printf("Yes\n");
} else {
if (dis[a][0] > L) printf("No\n");
else printf("Yes\n");
}
}
return 0;
}