1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #include <iostream> #include <stdio.h> #include <queue> #define int long long
using namespace std;
int ecnt = 2; int n, m, k, s, t; int head[150005], dis[150005], vis[150005]; struct edge { int to, next, w; } g[3000001]; void add_edge(int u, int v, int w) { g[ecnt] = (edge) { v, head[u], w }; head[u] = ecnt ++; } void add_edge(int u, int v, int w, int l) { add_edge(u + l * n, v + l * n, w); }
struct node { int dis, pos; friend bool operator < (const node &a, const node &b) { return a.dis > b.dis; } }; priority_queue<node> q;
void dijkstra() { for (int i = 0; i <= n * (k + 1) + 100; i ++) dis[i] = 8e18; dis[s] = 0; q.push((node) { dis[s], s }); while (!q.empty()) { int u = q.top().pos; q.pop(); if (vis[u]) continue; vis[u] = true; for (int e = head[u]; e; e = g[e].next) { int v = g[e].to; if (dis[v] > dis[u] + g[e].w) { dis[v] = dis[u] + g[e].w; q.push((node) { dis[v], v }); } } } }
signed main() { cin >> n >> m >> k >> s >> t; for (int i = 1; i <= m; i ++) { int u, v, w; cin >> u >> v >> w; for (int j = 0; j <= k; j ++) { add_edge(u, v, w, j); add_edge(v, u, w, j); } for (int j = 0; j < k; j ++) { add_edge(u + j * n, v + (j + 1) * n, 0); add_edge(v + j * n, u + (j + 1) * n, 0); } } dijkstra(); int ans = 8e18; for (int i = 0; i <= k; i ++) ans = min(ans, dis[t + i * n]); cout << ans << endl; return 0; }
|