洛谷P3403 跳楼机 题解 同余最短路
题目链接:https://www.luogu.com.cn/problem/P3403
参考博客:
- oi wiki https://oi-wiki.org/graph/mod-shortest-path/
- 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;
}
浙公网安备 33010602011771号