記錄路徑時要加上速度
#include<bits/stdc++.h>
using namespace std;
int n, m, d;
int tot, head[10001];
int vis[1001][1001];
double dis[1001][1001];
typedef pair<int, int> pii;
struct node
{
int to, v, s;
int next;
}t[100001];
pii from[1001][1001];
void add(int x, int y, int v, int s)
{
t[++tot].to = y;
t[tot].next = head[x];
t[tot].v = v;
t[tot].s = s;
head[x] = tot;
}
void print(int x, int v)
{
if (x == 1)return;
print(from[x][v].first, from[x][v].second);
printf("%d ", x - 1);
}
void dijkstra()
{
priority_queue<pair<double, pii>>q;//時間 點 速度
q.push(make_pair(0, make_pair(1, 70)));
for (int i = 1; i <= n + 1; i++) {
for (int j = 1; j <= 1000; j++) {
dis[i][j] = 1e9 + 7;
}
}
dis[1][70] = 0;
vis[1][70] = 1;
while (!q.empty())
{
int x = q.top().second.first;
int vx = q.top().second.second;
//cout << q.top().first<<" "<<x-1 << " " << vx << endl;
vis[x][vx] = 0;
q.pop();
for (int i = head[x]; i; i = t[i].next)
{
int y = t[i].to;
int vy = t[i].v;
if (vy)
{
if (dis[y][vy] > dis[x][vx] + (double)t[i].s / vy)
{
dis[y][vy] = dis[x][vx] + (double)t[i].s / vy;
from[y][vy] = make_pair(x, vx );
if (vis[y][vy])continue;
vis[y][vy] = 1;
q.push(make_pair(-dis[y][vy], make_pair(y, vy)));
//cout << "** " << dis[y][vy] << " " << y-1 << " "<<vy << endl;
}
}
else
{
if (dis[y][vx] > dis[x][vx] + (double)t[i].s / vx)
{
dis[y][vx] = dis[x][vx] + (double)t[i].s / vx;
from[y][vx] = make_pair(x, vx);
if (vis[y][vx])continue;
vis[y][vx] = 1;
q.push(make_pair(-dis[y][vx], make_pair(y, vx)));
//cout << "** " << dis[y][vx] << " " << y - 1 << " " << vy << endl;
}
}
}
}
int mi = 0;
dis[d][mi] = 1e9+7;
for (int i = 1; i <= 1000; i++)
{
if (dis[d][i] < dis[d][mi])mi = i;
}
//cout << "&&" << mi << " "<<dis[d][mi]<< endl;
cout << "0 ";
print(d, mi);
cout << endl;
}
int main()
{
cin >> n >> m >> d;
d++;
for (int i = 1; i <= m; i++)
{
int x, y, v, s;
cin >> x >> y >> v >> s;
x++, y++;
add(x, y, v, s);
}
dijkstra();
}