就是 BFS 的那个做法,同一位置不同 doge 之间的转移是边权为 0 的,不同位置之间的转移是边权为 1 的,我想着这样的 01 BFS 可以用双端队列来做。
但是这个写法为什么会挂啊,在 UOJ Extra Test #61 比答案多 1。
#include <deque>
#include <tuple>
#include <vector>
#include <iostream>
#include <algorithm>
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, m;
std::cin >> n >> m;
std::vector<int> b(m), p(m);
std::vector<std::vector<int>> doge(n);
for (int i = 0; i < m; ++i) {
std::cin >> b[i] >> p[i];
if (p[i] < n)
doge[b[i]].push_back(p[i]);
}
std::deque<std::tuple<int, int, int>> que;
std::vector<std::vector<bool>> vis(n, std::vector<bool>(n));
que.emplace_back(b[0], p[0], 0);
vis[b[0]][p[0]] = true;
while (!que.empty()) {
int u, w, d;
std::tie(u, w, d) = que.front();
que.pop_front();
if (u == b[1]) {
std::cout << d << '\n';
return 0;
}
for (auto i : doge[u]) {
if (!vis[u][i]) {
que.emplace_front(u, i, d);
vis[u][i] = true;
}
}
if (u - w >= 0 && !vis[u - w][w]) {
que.emplace_back(u - w, w, d + 1);
vis[u - w][w] = true;
}
if (u + w < n && !vis[u + w][w]) {
que.emplace_back(u + w, w, d + 1);
vis[u + w][w] = true;
}
}
std::cout << -1 << '\n';
return 0;
}
萌新刚学 BFS,求耐心指教。