| 12
 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;
 }
 
 |