照第一篇题解思路写的
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e4+2,MAXM=5e4+2,MAXK=15;
int n,m,K,head[MAXN],val[MAXM<<3],to[MAXM<<3],nxt[MAXM<<3],indx=1,S,E,dis[MAXN],vis[MAXN];
void add(int a,int b,int v){
to[indx]=b;
val[indx]=v;
nxt[indx]=head[a];
head[a]=indx;
indx++;
return;
}
void init(){
memset(dis,0x3f,sizeof(dis));
cin>>n>>m>>K>>S>>E;
S++;
E++;
int st,ed,v;
for(int i=1;i<=m;i++){
cin>>st>>ed>>v;
add(st+1,ed+1,v);
add(ed+1,st+1,v);
for(int j=1;j<=K;j++){
add(st+1,ed+j*n+1,0);
add(ed+1,st+j*n+1,0);
add(st+j*n+1,ed+j*n+1,v);
add(ed+j*n+1,st+j*n+1,v);
}
}
for(int i=1;i<=K;i++)add(n*(i-1)+E,n*i+E,0);
return;
}
void solve(){
int now;
dis[S]=0;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >pq;
pq.push(make_pair(dis[S],S));
while(!pq.empty()){
now=pq.top().second;
pq.pop();
if(!vis[now]){
vis[now]=true;
for(int i=head[now];i;i=nxt[i]){
if(dis[to[i]]>dis[now]+val[i]){
dis[to[i]]=dis[now]+val[i];
pq.push(make_pair(dis[to[i]],to[i]));
}
}
}
}
return;
}
int main(){
init();
solve();
cout<<dis[E+n*K];
return 0;
}