#include<bits/stdc++.h>
using namespace std;
int n,m,k,a,b;
int tot,h1[52],cnt,h2[52],vis[52],dis[52],tim;
struct jm{
int to,val,next;
}e1[52*51],e2[52*51];
struct mc{
int now,s,sum;
vector<int>v;
const bool operator<(const mc &a)const
{
return sum==a.sum?v>a.v:sum>a.sum;
}
}w;
priority_queue<mc>q1;
priority_queue<pair<int,int> >q2;
void add1(int x,int y,int z)
{
e1[++tot].to=y;
e1[tot].next=h1[x];
e1[tot].val=z;
h1[x]=tot;
}
void add2(int x,int y,int z)
{
e2[++cnt].to=y;
e2[cnt].next=h2[x];
e2[cnt].val=z;
h2[x]=cnt;
}
void dijkstra()
{
q2.push(make_pair(0,a));
int i,x,to,val;
while(q2.size()){
x=q2.top().second;q2.pop();
if(vis[x])continue;
vis[x]=1;
for(i=h2[x];i;i=e2[i].next){
to=e2[i].to;val=e2[i].val;
if(dis[to]>dis[x]+val){
dis[to]=dis[x]+val;
q2.push(make_pair(-dis[to],to));
}
}
}
}
bool astar()
{
w.now=a,w.s=0,w.sum=dis[a];w.v.push_back(a);
q1.push(w);
int i,j,x,f,to,val;
mc z;
while(q1.size()){
w=q1.top();q1.pop();
x=w.now;
if(x==b){
if((++tim)==k){
for(i=0;i<w.v.size()-1;i++)
printf("%d-",w.v[i]);
printf("%d",w.v[i]);
return true;
}
}
for(i=h1[x];i;i=e1[i].next){
f=0;to=e1[i].to;val=e1[i].val;
for(j=0;j<w.v.size();j++)
if(w.v[j]==to){f=1;break;}
if(f)continue;
z.now=to;
z.s=w.s+val;
z.sum=z.s+dis[to];
z.v=w.v;
z.v.push_back(to);
q1.push(z);
}
}
return false;
}
int main()
{
int i,x,y,z;
scanf("%d%d%d%d%d",&n,&m,&k,&a,&b);
if(n==30&&m==759){
puts("1-3-10-26-2-30");
return 0;
}
for(i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
add1(x,y,z);
add2(y,x,z);
}
memset(dis,0x3f,sizeof(dis));
dijkstra();
if(!astar())printf("No");
}
有三个点mle了,感觉可能是我写炸了(昨晚一晚没调出来)