fi,j
表示到
i
号点,速度为
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
typedef double db;
typedef pair<int,int>abcd;
#define fi first
#define se second
const int N=160;
const int M=22510;
const db INF=1e16;
int n,m,T;
int h[N];
int num,t[M],nx[M],v[M];
db f[N][510],tmp,l[M],Ans=INF;
abcd lst[N][510];
int x,y,z,mx=70;
int a[N],cnt;
bool b[N][510];
queue<abcd>q;
inline void Add(int x,int y,int z,db k){
t[++num]=y;v[num]=z;l[num]=k;nx[num]=h[x];h[x]=num;
}
int main(){
scanf("%d%d%d",&n,&m,&T);
while(m--)scanf("%d%d%d%lf",&x,&y,&z,&tmp),Add(x,y,z,tmp),mx=max(mx,z);
for(int i=0;i<n;i++)
for(int j=0;j<=mx;j++)
f[i][j]=INF;
f[0][70]=0;q.push(abcd(0,70));
while(!q.empty()){
abcd x=q.front();q.pop();
db y=f[x.fi][x.se];
for(int j=h[x.fi];j;j=nx[j]){
if(v[j]){
if(y+l[j]/v[j]<f[t[j]][v[j]]){
f[t[j]][v[j]]=y+(db)l[j]/v[j];
lst[t[j]][v[j]]=x;
if(!b[t[j]][v[j]])q.push(abcd(t[j],v[j])),b[t[j]][v[j]]=1;
}
}else{
if(y+l[j]/x.se<f[t[j]][x.se]){
f[t[j]][x.se]=y+l[j]/x.se;
lst[t[j]][x.se]=x;
if(!b[t[j]][x.se])q.push(abcd(t[j],x.se)),b[t[j]][x.se]=1;
}
}
}
b[x.fi][x.se]=0;
}
for(int i=0;i<=mx;i++)
if(f[T][i]<Ans)Ans=f[T][i],x=i;
for(int i=T;i;){
a[++cnt]=i;
int t=i;
i=lst[i][x].fi;x=lst[t][x].se;
}
putchar('0');
for(int i=cnt;i;i--)printf(" %d",a[i]);
return 0;
}