/* bzoj 2763 SPFA小优化 循环队列+SLF 顺面改掉自己之前手打qeueu的坏毛病*/ #include<iostream> #include<cstring> #include<cstdio> #define mk make pair #define maxn 2000010 #define N 2000000 using namespace std; int n,m,k,s,t,num,hea[maxn],dis[maxn],c[maxn]; int x[maxn],y[maxn],z[maxn],ans=0xfffffff; int q[maxn],head,tail; bool f[maxn]; struct node { int u,v,pre,t; }e[maxn]; void Add(int from,int to,int Dis) { for(int i=hea[from];i;i=e[i].pre) if(e[i].v==to) { e[i].t=min(e[i].t,Dis); return; } num++; e[num].u=from; e[num].v=to; e[num].t=Dis; e[num].pre=hea[from]; hea[from]=num; } void SPFA(int x) { memset(dis,127/3,sizeof(dis)); q[tail++]=x;f[x]=1;dis[x]=0; while(head!=tail) { int k=q[head++];f[k]=0; if(head>N)head=1;//循环队列 for(int i=hea[k];i;i=e[i].pre) { int v=e[i].v; if(dis[v]>dis[k]+e[i].t) { dis[v]=dis[k]+e[i].t; if(f[v]==0) { if(dis[v]<dis[q[head]]){//SLF if(--head<0)head=N-1; q[head]=v; } else { q[tail++]=v; if(tail>N)tail=1; } } } } } } int main() { scanf("%d%d%d%d%d",&n,&m,&k,&s,&t); s++;t++;n=n+n*k; for(int i=1;i<=m;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]),x[i]++,y[i]++; for(int i=1;i<=m;i++) for(int j=1;j<=k+1;j++) { Add((x[i]-1)*(k+1)+j,(y[i]-1)*(k+1)+j,z[i]); Add((y[i]-1)*(k+1)+j,(x[i]-1)*(k+1)+j,z[i]); if(j<=k) { Add((x[i]-1)*(k+1)+j,(y[i]-1)*(k+1)+j+1,0); Add((y[i]-1)*(k+1)+j,(x[i]-1)*(k+1)+j+1,0); } } SPFA((s-1)*(k+1)+1); for(int j=1;j<=k+1;j++) ans=min(ans,dis[(t-1)*(k+1)+j]); printf("%d ",ans); return 0; }