@[Half_Monkey](/user/326254) 帮你调好了:
```cpp
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int to, w;
};
vector<node> vec[300100];
int vis[300100], dis[300100], ans=99999999;
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
int s, t;
cin >> s >> t;
for(int i=1; i<=m; ++i) {
int u, v, w;
cin >> u >> v >> w;
vec[u].push_back({v,w});
vec[v].push_back({u,w});
for(int j=1; j<=k; ++j) {
vec[v+(j-1)*n].push_back({u+n*j,0});
vec[u+(j-1)*n].push_back({v+n*j,0});
vec[v+n*j].push_back({u+n*j,w});
vec[u+n*j].push_back({v+n*j,w});
}
}
priority_queue<pair<int,int> > que;
que.push({0, s});
memset(dis, 0x7f, sizeof dis);
dis[s] = 0;
while(!que.empty()) {
int index = que.top().second; que.pop();
if(vis[index]) continue;
vis[index] = 1;
for(int i=0; i<vec[index].size(); ++i) {
if(dis[vec[index][i].to] > dis[index] + vec[index][i].w) {
dis[vec[index][i].to] = dis[index] + vec[index][i].w;
que.push({-dis[vec[index][i].to], vec[index][i].to});
}
}
}
for(int i=0;i<=k;i++)ans=min(ans,dis[t+i*n]);
cout << ans;
return 0;
}
```
by w9095 @ 2023-07-25 13:05:14
@[Half_Monkey](/user/326254)
~~蓝勾巨佬先%为敬~~
问题:
$1$:建边的时候,你只建第 $0$ 层到其余层的边,没有考虑到层与层之间的相互转移。
$2$:[警示后人](https://www.luogu.com.cn/discuss/639017) 里面的第 $2$ 条。
by w9095 @ 2023-07-25 13:08:48
P.S:你的建边方法似乎也可以,但是应该建 $(t+n\times i)\to (t+n\times (i-1))$ 的边吧(没试过,不敢确定
by w9095 @ 2023-07-25 13:10:32
@[w9095](/user/569235) 感谢
by LonginusMonkey @ 2023-07-25 13:35:06