精明的小r每每開車出行總是喜歡走最快路線,而不是最短路線.很明顯,每條道路的限速是小r需要考慮的關鍵問題.不過有一些限速標誌丟失了,於是小r將不知道能開多快.不過有乙個合理的方法是進入這段道路時不改變速度行駛.你的任務就是計算從小r家(0號路口)到d號路口的最快路線.
現在你得到了這個城市的地圖,這個地圖上的路都是單向的,而且對於兩個路口a和b,最多只有一條道路從a到b.並且假設可以瞬間完成路口的轉彎和加速.
第一行是三個整數n,m,d(路口數目,道路數目,和目的地). 路口由0...n-1標號
接下來m行,每行描述一條道路:有四個整數a,b,v,l,(起始路口,到達路口,限速,長度) 如果v=0說明這段路的限速標誌丟失.
開始時你位於0號路口,速度為70.
僅僅一行,按順序輸出從0到d經過的城市.保證最快路線只有一條.
6 15 1
0 1 25 68
0 2 30 50
0 5 0 101
1 2 70 77
1 3 35 42
2 0 0 22
2 1 40 86
2 3 0 23
2 4 45 40
3 1 64 14
3 5 0 23
4 1 95 8
5 1 0 84
5 2 90 64
5 3 36 40
0 5 2 3 1
【資料範圍】
30% n<=20
100% 2<=n<=150;0<=v<=500;1<=l<=500
用dis[i][v]表示走到i點速度為v的最短時間,spfa。
//serene#include#include#include#include#include#includeusing namespace std;
const int maxn=150+10,maxv=500+10,maxm=maxn*maxn;
const double inf=2e8;
int n,m,s=1,t,zz[maxn];
int aa;char cc;
int read()
int fir[maxn],to[maxm],nxt[maxm],e=0;
double v[maxm],l[maxm];
void add(int x,int y,double vv,double ll)
struct nodenode[maxn*maxv];
double dis[maxn][maxv];
bool vis[maxn][maxv];
int from[maxn][maxv];
void spfa()
} }}int main()
spfa();
double ans=inf;
for(int i=0;i<=500;++i) if(dis[t][i]int tot=0;
for(int i=t*1000+vv;i/1000!=1;i=from[i/1000][i%1000]) zz[++tot]=i/1000;
printf("0");
for(int i=tot;i;--i) printf(" %d",zz[i]-1);
return 0;
}
BZOJ 3245 最快路線
bzoj的source已經暴露了一切 直接上spfa,對於乙個點記錄到達它時的速度,然後進行轉移,基本上就是乙個分層圖的思路吧。因為要輸出方案,多開乙個陣列記錄就行了。include include include include include include using namespace st...
bzoj3245 最快路線 spfa
精明的小r每每開車出行總是喜歡走最快路線,而不是最短路線.很明顯,每條道路的限速是小r需要考慮的關鍵問題.不過有一些限速標誌丟失了,於是小r將不知道能開多快.不過有乙個合理的方法是進入這段道路時不改變速度行駛.你的任務就是計算從小r家 0號路口 到d號路口的最快路線.現在你得到了這個城市的地圖,這個...
qzezoj 1543 最快路線
題面傳送門 看到這道題,想到spf aspfa spfa 但這道題好像故意的,偏偏又路牌被拆的道路 在衢州的話負責那一段路的交警就該 了 所以我們不能只以d id i di 為tim etime time 的唯一標準。想象一下 如果下一條路是沒有路牌的,而這時過來一條路,tim etime time...