Initial commit: C++ courseware
This commit is contained in:
commit
4a4ee7c287
1789 files changed
+373489
No files matched your search
@@ -0,0 +1,50 @@
|
||||
// P4568 / 教材例 10-2:隐式分层图,最多 k 次免费。
|
||||
// n m k;s t;m 行 u v w。城市从 0 编号,无向非负边。
|
||||
// 课堂扩展约定:如果没有路线,输出 -1;原题未指定此情况的输出。
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <tuple>
|
||||
#include <functional>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
using ll = long long;
|
||||
using State = tuple<ll, int, int>;
|
||||
struct Edge { int to; ll w; };
|
||||
int main() {
|
||||
ios::sync_with_stdio(false); cin.tie(nullptr);
|
||||
int n, m, k, s, t;
|
||||
if (!(cin >> n >> m >> k >> s >> t)) return 0;
|
||||
vector<vector<Edge>> g(n);
|
||||
for (int i = 0; i < m; ++i) {
|
||||
int u, v; ll w; cin >> u >> v >> w;
|
||||
g[u].push_back({v, w});
|
||||
g[v].push_back({u, w});
|
||||
}
|
||||
const ll INF = (1LL << 60);
|
||||
vector<vector<ll>> dis(k + 1, vector<ll>(n, INF));
|
||||
priority_queue<State, vector<State>, greater<State>> q;
|
||||
dis[0][s] = 0;
|
||||
q.push({0, s, 0});
|
||||
while (!q.empty()) {
|
||||
State cur = q.top(); q.pop();
|
||||
ll d = get<0>(cur);
|
||||
int u = get<1>(cur), j = get<2>(cur);
|
||||
if (d != dis[j][u]) continue;
|
||||
for (const auto &e : g[u]) {
|
||||
int v = e.to;
|
||||
ll nd = d + e.w;
|
||||
if (nd < dis[j][v]) {
|
||||
dis[j][v] = nd;
|
||||
q.push({nd, v, j});
|
||||
}
|
||||
if (j < k && d < dis[j + 1][v]) {
|
||||
dis[j + 1][v] = d;
|
||||
q.push({d, v, j + 1});
|
||||
}
|
||||
}
|
||||
}
|
||||
ll ans = INF;
|
||||
for (int j = 0; j <= k; ++j) ans = min(ans, dis[j][t]);
|
||||
cout << (ans == INF ? -1 : ans) << '\n';
|
||||
}
|
||||
Reference in new issue
Block a user