洛谷P3403 跳楼机 题解 同余最短路

题目链接:https://www.luogu.com.cn/problem/P3403

参考博客:

  1. oi wiki https://oi-wiki.org/graph/mod-shortest-path/
  2. xht大佬的博客 https://www.luogu.com.cn/article/tgfwb3v0

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;

long long h, dis[maxn];
bool vis[maxn];
int x, y, z;
struct Edge { int v, w; };
vector<Edge> g[maxn];

struct Node {
    int u;
    long long dis;

    bool operator < (const Node &b) const {
        return dis > b.dis;
    }
};

void dijkstra() {
    priority_queue<Node> que;
    fill(dis, dis+x, -1ll);
    int st = 1 % x;
    dis[st] = 1;
    que.push({1, 1});
    while (!que.empty()) {
        Node nd = que.top();
        que.pop();
        int u = nd.u;
        long long _dis = nd.dis;
        if (vis[u]) continue;
        vis[u] = true;
        int arr[2] = { y, z };
        for (int i = 0; i < 2; i++) {
            int v = (u + arr[i]) % x;
            if (dis[v] == -1 || dis[v] > dis[u] + arr[i]) {
                dis[v] = dis[u] + arr[i];
                que.push({ v, dis[v] });
            }
        }
    }
}

int main() {
    cin >> h >> x >> y >> z;
    dijkstra();
    long long ans = 0;
    for (int i = 0; i < x; i++)
        if (dis[i] != -1 && dis[i] <= h)
            ans += (h - dis[i]) / x + 1;
    printf("%lld\n", ans);
    return 0;
}
posted @ 2025-04-04 02:48  quanjun  阅读(24)  评论(0)    收藏  举报