盯了一个小时也没发现问题,在ans取min的时候就全是0了
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int N = 2e6+10;
const int inf = 1e9;
int n, m, k, s, t, ans = inf;
struct edge{
int to, nxt, w;
} e[N<<1];
int head[N], cnt, vis[N], dis[N];
inline void add(int u, int v, int w){
cnt++;
e[cnt].to = v;
e[cnt].nxt = head[u];
e[cnt].w = w;
head[u] = cnt;
}
struct node{
int dis, pos;
bool operator <(const node&a)const{
return a.dis < dis;
}
};
priority_queue<node> q;
inline void djstra(int s){
memset(dis, inf, sizeof(dis));
q.push((node){0, s});
dis[s] = 0;
while(!q.empty()){
int u = q.top().pos;
q.pop();
if(vis[u]) continue;
vis[u] = 1;
for(int i=head[u]; i; i=e[i].nxt){
int to = e[i].to;
if(dis[to] > dis[u] + e[i].w){
dis[to] = dis[u] + e[i].w;
if(!vis[to]) q.push((node){dis[to], to});
}
}
}
}
int main(){
scanf("%d%d%d%d%d", &n, &m, &k, &s, &t);
++s, ++t;
memset(vis, 0, sizeof(vis));
for(int u, v, c, i=1; i<=m; i++){
scanf("%d%d%d", &u, &v, &c);
++u, ++v;
add(u, v, c);
add(v, u, c);
for(int j=1; j<=k; j++){
add(u+(j-1)*n, v+j*n, 0);
add(v+(j-1)*n, u+j*n, 0);
add(u+j*n, v+j*n, c);
add(v+j*n, u+j*n, c);
}
}
djstra(s);
for(int i=0; i<=k; i++) ans = min(ans, dis[t+i*n]);
printf("%d", ans);
return 0;
}