调傻了,和第一篇题解很像了。
我寻思这dij和建边都没问题到底是哪出问题了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <functional>
using namespace std;
typedef pair<int, int> pii;
const int N = 2e6 + 7;
const int M = 155555;
struct Edge {
int to;
int nxt;
int w;
}e[N];
int head[M], edge_num = 0, n, m, k, s, t;
inline void add_edge (int x, int y, int z) {
e[++edge_num] = (Edge) {y, head[x], z};
head[x] = edge_num;
}
int dis[M];
bool vis[M];
inline void Dij (int s) {
memset (dis, 0x3f, sizeof (dis));
dis[s] = 0;
priority_queue<pii, vector<pii>, greater<pii> > q;
q.push (make_pair (0, s));
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (!vis[u]) {
vis[u] = true;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (dis[v] > dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push (make_pair(dis[v], v));
}
}
}
}
}
int main() {
scanf ("%d%d%d%d%d", &n, &m, &k, &s, &t);
for (int i = 1, u, v, w; i <= m; i ++) {
scanf ("%d%d%d", &u, &v, &w);
add_edge (u, u, w);
add_edge (v, u, w);
for (int j = 1; j <= k; j ++) {
add_edge ((j - 1) * n + u, (j) * n + v, 0);
add_edge ((j - 1) * n + v, (j) * n + u, 0);
add_edge (j * n + u, j * n + v, w);
add_edge (j * n + v, j * n + u, w);
}
}
for (int i = 1; i <= k; i ++) {
add_edge ((i - 1) * n + t, (i) * n + t, 0);
}
Dij (s);
printf ("%d", dis[k * n + t]);
return 0;
}