題面傳送門
看到這道題,想到\(spfa\)。
但這道題好像故意的,偏偏又路牌被拆的道路(在衢州的話負責那一段路的交警就該**了),
所以我們不能只以\(d_i\)為\(time\)的唯一標準。
想象一下:如果下一條路是沒有路牌的,而這時過來一條路,\(time\)比\(d_i\)大,但如果下一條路可以走得通怎麼辦?而且還走得比\(d_i\)快。這時候就進退兩難,如果放過去,那\(spfa\)就廢了。
如果不放過去,答案就廢了。
想想\(flying\)經常說什麼?\(dp\)狀態表達不完整就再加一維狀態!我們可以用\(dp\)的思路:以\(d_\)表示以\(j\)速度開到\(i\)點所需最短時間。那麼\(spfa\)還是照樣鬆弛唄。
這道題要求我們輸出經過點序,所以我們可以\(spfa\)的過程中當出現乙個最優解時指回去。然後最後倒序輸出。
**實現:
#include#includeusing namespace std;
int n,m,k,x,y,z,h,zj[100039],head,now1[159][559],now2[159][559],tmp1,tmp2;
double dp[159][559],ans;
struct yyyf[159][159],cur;
struct fstmp;
queueq;
int main();
q.push((fs));
for(i=0;i<=500;i++) now1[0][i]=-1,now2[0][i]=-1;
for(i=0;i<=150;i++)
dp[0][70]=0;
while(!q.empty())
for(i=1;i<=550;i++)
for(j=head;j>=1;j--) printf(" %d",zj[j]);
printf(" %d",k);}}
}
然而又要卡常......可能這道題有卡\(spfa\)的資料吧......
加暫存器,手寫佇列......又是卡過去的......\(966ms\)。本機都跑的飛快呀......
**實現:
#include#includeusing namespace std;
int zj[1039],now1[159][559],now2[159][559];
double dp[159][559],ans;
struct yyyf[159][159];
struct fsq[500039];
inline void read(int &x)
int main();
q[++ta]=((fs));
for(i=0;i<=500;i++) now1[0][i]=-1,now2[0][i]=-1;
for(i=0;i<=n;i++)
dp[0][70]=0;
while(he!=ta)
for(i=1;i<=500;i++)
for(j=head;j>=1;j--) printf("%d ",zj[j]);
printf("%d ",k);}}
}
qzezoj 1543 最快路線
題面傳送門 看到這道題,想到spf aspfa spfa 但這道題好像故意的,偏偏又路牌被拆的道路 在衢州的話負責那一段路的交警就該 了 所以我們不能只以d id i di 為tim etime time 的唯一標準。想象一下 如果下一條路是沒有路牌的,而這時過來一條路,tim etime time...
BZOJ 3245 最快路線
bzoj的source已經暴露了一切 直接上spfa,對於乙個點記錄到達它時的速度,然後進行轉移,基本上就是乙個分層圖的思路吧。因為要輸出方案,多開乙個陣列記錄就行了。include include include include include include using namespace st...
bzoj3245 最快路線
精明的小r每每開車出行總是喜歡走最快路線,而不是最短路線.很明顯,每條道路的限速是小r需要考慮的關鍵問題.不過有一些限速標誌丟失了,於是小r將不知道能開多快.不過有乙個合理的方法是進入這段道路時不改變速度行駛.你的任務就是計算從小r家 0號路口 到d號路口的最快路線.現在你得到了這個城市的地圖,這個...