// P4568 / 教材例 10-2:隐式分层图,最多 k 次免费。 // n m k;s t;m 行 u v w。城市从 0 编号,无向非负边。 // 课堂扩展约定:如果没有路线,输出 -1;原题未指定此情况的输出。 #include #include #include #include #include #include using namespace std; using ll = long long; using State = tuple; 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> 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> dis(k + 1, vector(n, INF)); priority_queue, greater> 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'; }