0分求调!!!
查看原帖
0分求调!!!
641917
liuhaoxing楼主2023/8/2 23:07

我用的是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;
}

救急!

2023/8/2 23:07
加载中...