70分TLE:
#include<bits/stdc++.h>
using namespace std;
struct node{
int to,v,l;
bool operator==(const node A)const{
return to==A.to&&v==A.v&&l==A.l;
}
};
struct edge{
int x;double dis;int v;int last;int k;
bool operator<(const edge A)const{
return dis>A.dis;
}
};
struct from{
int x,v;
};
int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void write(int x)
{
if(x>9)
write(x/10);
putchar(x%10+'0');
return;
}
node g[155][155];
int n,m,d;
int vis[505][155];
double dis[505][155];
from form[155][505];
void Dijkstra()
{
priority_queue<edge>q;
for(int i=0;i<=500;i++)
for(int j=0;j<=n;j++)
dis[i][j]=1145141919;
dis[70][0]=0;
edge begin;
begin.dis=0,begin.last=0,begin.k=1,begin.v=70,begin.x=0;
q.push(begin);
while(!q.empty())
{
edge u=q.top();q.pop();
if(vis[u.v][u.x]==1) continue;
vis[u.v][u.x]=1;
dis[u.v][u.x]=u.dis;
form[u.x][u.v]=(from){u.last,u.k};
for(int i=1;i<=n;i++)
{
if(g[u.x][i]==(node){0,0,0}) continue;
if(g[u.x][i].v==0)
{
edge last;
last.x=g[u.x][i].to;
last.dis=u.dis+g[u.x][i].l*1.0/u.v;
last.v=u.v;
last.last=u.x;
last.k=u.v;
q.push(last);
}
else
{
edge last;
last.x=g[u.x][i].to;
last.dis=u.dis+g[u.x][i].l*1.0/g[u.x][i].v;
last.v=g[u.x][i].v;
last.last=u.x;
last.k=u.v;
q.push(last);
}
}
}
}
void work(int x,int v)
{
if(x==0&&v==70) return;
work(form[x][v].x,form[x][v].v);
write(x);printf(" ");
}
int main()
{
cin>>n>>m>>d;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=(node){0,0,0};
for(int i=1;i<=m;i++)
{
int a=read(),b=read(),v=read(),l=read();
g[a][b]=(node){b,v,l};
}
Dijkstra();
double xi=1145141919;int xnum;
for(int i=1;i<=500;i++)
{
if(dis[i][d]<=xi) xnum=i,xi=dis[i][d];
}
cout<<0<<" ";
work(d,xnum);
}