裸的分层图最短路,直接做就好了,问题是手动循环队列的那个地方要加上,不然RE到爽。。而且注意加上了以后改变一下队列的存储顺序。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,m,k,s,tt;
const int N=2e5+5;
const int inf=2147483646;
int head[N],next[N],go[N],val[N];
int dis[N][13];
bool vis[N][13];
int q[N][11],tot;
inline void spfa()
{
memset(dis,127/3,sizeof(dis));
int t=0,w=1;
q[0][0]=s,q[0][1]=0;
vis[s][0]=1;
dis[s][0]=0;
while (t!=w)
{
int x=q[t][0],tmp=q[t++][1];
if (t==100001)t=0;
for(int i=head[x];i;i=next[i])
{
int v=go[i];
if (dis[x][tmp]+val[i]<dis[v][tmp])
{
dis[v][tmp]=dis[x][tmp]+val[i];
if (!vis[v][tmp])
{
vis[v][tmp]=1;
q[w][0]=v,q[w++][1]=tmp;
if (w==100001)w=0;
}
}
if (dis[x][tmp]<dis[v][tmp+1]&&tmp<k)
{
dis[v][tmp+1]=dis[x][tmp];
if (!vis[v][tmp+1])
{
vis[v][tmp+1]=1;
q[w][0]=v,q[w++][1]=tmp+1;
if (w==100001)w=0;
}
}
}
vis[x][tmp]=0;
}
int ans=inf;
fo(i,0,k)ans=min(ans,dis[tt][i]);
printf("%d\n",ans);
}
inline void add(int x,int y,int z)
{
go[++tot]=y;
val[tot]=z;
next[tot]=head[x];
head[x]=tot;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&tt);
fo(i,1,m)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
spfa();
return 0;
}