萌新求助 BFS,UOJ WA on Extra Test #61
查看原帖
萌新求助 BFS,UOJ WA on Extra Test #61
52243
RenaMoe楼主2021/6/10 09:58

就是 BFS 的那个做法,同一位置不同 doge 之间的转移是边权为 00 的,不同位置之间的转移是边权为 11 的,我想着这样的 01 BFS 可以用双端队列来做。

但是这个写法为什么会挂啊,在 UOJ Extra Test #61 比答案多 11

评测信息

#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,求耐心指教。

2021/6/10 09:58
加载中...