rt,实在调不出来了/kk
#include<bits/stdc++.h>
#define int long long
#define pii std::pair<int,int>
#define fi first
#define se second
#define mk(P,Q) std::make_pair((P),(Q))
const int maxn=1e4+10,maxk=15;
const int maxnk=maxn*maxk;
int n,m,k,s,t;
//(k+1) 层的分层图 目标:s -> 每一行的 t(对于第 i 行,这一行的 t 为 i*n+t)
std::vector<pii>a[maxnk];
int dis[maxnk];
bool vis[maxnk];
std::priority_queue<pii,std::vector<pii>,std::greater<pii> >q;
int num(int x,int y){//第 x 行 第 y 个 点
return (x-1)*n+y;
}
//每层图中连边,上下也要连边
void edge(int u,int v,int w){//连边
a[u].push_back(mk(v,w));
a[v].push_back(mk(u,w));
return ;
}
void push(int p){
q.push({dis[p],p});
return ;
}
void dij(){
memset(dis,0x7f,sizeof(dis));
s=num(1,s);
dis[s]=0;
push(s);
while(q.size()){
int tp=q.top().se;
q.pop();
if(vis[tp]) continue;
vis[tp]=1;
for(int i=0;i<a[tp].size();i++){
int v=a[tp][i].fi,w=a[tp][i].se;
if(dis[v]>=dis[tp]+w) dis[v]=dis[tp]+w,push(v);
}
}
return ;
}
void build(){//建分层图 , 从第一层开始
for(int i=1;i<=m;i++){
int u,v,w;//从 u 到 v , 边权为 w
std::cin>>u>>v>>w;
int ru,rv;
ru=num(1,u),rv=(1,v);
edge(ru,rv,w);
for(int j=2;j<=k+1;j++){//k+1 层的分层图
//每次从 j-1 层向 j 层连边
rv=num(j,v);
a[ru].push_back(mk(rv,0));
ru=num(j,u);
edge(ru,rv,w);
}
}
return ;
}
signed main(){
std::cin>>n>>m>>k>>s>>t;
build();
dij();
int ans=0x3f3f3f3f;
for(int i=1;i<=k+1;i++) ans=std::min(ans,dis[num(i,t)]);
std::cout<<ans;
return 0;
}