1. 程式人生 > >USACO 2009 Dec cow toll paths 過路費-floyd

USACO 2009 Dec cow toll paths 過路費-floyd

span spa 個性 一個點 其他 paths tex 喜歡 後處理

這道題首先要明確一點,那就是當你從一個點走到自己時,也是需要花費這個點點權值的費用。這個點卡了我兩次QWQ

然後我比較喜歡分兩步搞:

首先,我們利用floyd的一個性質:就是在更新其他點之間的路線時要先引入一個點,而枚舉是按編號

再來看這道題,如果它不要求加點權,那麽就是裸的floyd,所以這道題難點就在於如何確定一條路徑上最大的點,這時就容易讓人想到這道題有一個排序步驟,因為排完序後在每一位都可以確定它前面的點都比它大/小。

好了,那麽顯然是在枚舉的時候,如果我們把小的點先枚舉,大的點後枚舉,不就能保證之前更新的值都小於這個值(也就是說路徑上的值最大為這個枚舉點)了嗎^_^

所以

考慮用f[i][j]來表示以i,j為兩端的最短路,不過值得註意的是,這條路徑上沒有比i,j,k點權更大的點

考慮用dp[i][j]來表示答案,也就是以i,j為兩端,路徑上比較大的點權+總邊權

所以轉移方程就是:

f[i][j]=min(f[i][j],f[i][k]+f[k][j]);

dp[i][j]=min(dp[i][j],f[i][j]+max(a[i],a[j],a[k]);

最後處理一下映射細節就好了

USACO 2009 Dec cow toll paths 過路費-floyd