我用的是SPFA算法求最短路,但换了三种写法都错了,样例都过不了!
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n, m, q, h[200005], ne[200005], t[200005], num, dis[200005][2];
bool vis[200005][2];
void add(int u, int v) {
ne[++num] = h[u];
t[num] = v;
h[u] = num;
}
void SPFA() {
queue<int> que;
que.push(1);
memset(dis, 2e9, sizeof(dis));
dis[1][0] = 0;
while (!que.empty()) {
int cur = que.front();
que.pop();
for (int i = h[cur]; i != -1; i = ne[i]) {
int j = t[i];
if (dis[j][1] > dis[cur][0] + 1) {
dis[j][1] = dis[cur][0] + 1;
if (!vis[j][1]) {
vis[j][1] = true;
que.push(j);
}
}
if (dis[j][0] > dis[cur][1] + 1) {
dis[j][0] = dis[cur][1] + 1;
if (!vis[j][0]) {
vis[j][0] = true;
que.push(j);
}
}
}
}
}
int main() {
cin >> n >> m >> q;
memset(h, -1, sizeof(h));
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
}
SPFA();
while (q--) {
int a, l;
cin >> a >> l;
if (l >= dis[a][l % 2])
cout << "YES\n";
else
cout << "NO\n";
}
return 0;
}
救急!