qzezoj 1543 最快路線

2022-05-11 13:45:06 字數 1601 閱讀 8316

題面傳送門

看到這道題,想到\(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號路口的最快路線.現在你得到了這個城市的地圖,這個...