luogu1266分層圖最短路

記錄路徑時要加上速度

#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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章