有向圖 g有n個頂點 1, 2, …, n,點i 的權值為 w(i)。現在有乙隻螞蟻,從給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都會下降為原來的 ρ 倍,其中ρ 是乙個給定的小於1的正常數。而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。 我們把螞蟻在爬行路徑上幸福度的總和記為 h。很顯然,對於不同的爬行路徑,h 的值也可能不同。小 z 對 h 值的最大可能值很感興趣,你能幫助他計算嗎?注意,螞蟻爬行的路徑長度可能是無窮的。
每一行中兩個數之間用乙個空格隔開。
輸入檔案第一行包含兩個正整數 n, m,分別表示 g 中頂點的個數和邊的條數。
第二行包含 n個非負實數,依次表示 n個頂點權值 w(1), w(2), …, w(n)。
第三行包含乙個正整數 v0,表示給定的起點。
第四行包含乙個實數 ρ,表示給定的小於 1的正常數。
接下來 m行,每行兩個正整數 x, y,表示是g的一條有向邊。可能有自環,但不會有重邊。
僅包含乙個實數,即 h值的最大可能值,四捨五入到小數點後一位。
5 5
10.0 8.0 8.0 8.0 15.0
1 0.5
1 2
2 3
3 4
4 2
4 5
18.0
對於 100%的資料, n ≤ 100, m ≤ 1000, ρ ≤ 1 – 10^-6, w(i) ≤ 100 (i = 1, 2, …, n)。
正解:倍增+$floyd$。
注意到$p^$的取值,當$k$很大時$p^$會很小。
所以我們可以卡一下,當$p$很小時就可以直接退出了。
寫乙個倍增+$floyd$就行了,每次用鬆弛點的最大值來更新一條路。
1 #include 2#define il inline
3#define rg register
4#define ll long long
5#define ld long double
6#define inf (1e30)78
using
namespace
std;
910 ld f[110][110],g[110][110],w[110
],p,ans;
11int
n,m,s;
1213
intmain()
30for (rg int i=1;i<=n;++i) ans=max(ans,f[s][i]);
31 printf("
%0.1lf\n
",w[s]+ans); return0;
32 }
bzoj 2306 Ctsc2011 幸福路徑
有向圖 g有n個頂點 1,2,n,點i 的權值為 w i 現在有乙隻螞蟻,從 給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都 p,而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。求最大幸福值。因為當體力很小後,對答案就沒什麼影響力,所以用乙...
BZOJ2306 幸福路徑(動態規劃,倍增)
bzoj 不要求確切的值,只需要逼近 顯然可以通過移動 步來達到逼近的效果 考慮每次的一步怎麼移動 設f i j f i j 表示走i i 步到了j role presentation j j能夠得到的最大權值 f i v ma x f i 1 u w v pi u,v g f i v max f ...
BZOJ 1919 Ctsc2010 效能優化
題目 題意 給出兩個長度為 n 的整數序列a 0.n 1 b 0.n 1 和非負整數 c 對於兩個長度為 n的整數序列,定義 運算,結果為乙個長度為 n的整數序列,例如f g h 則有h k i j k modn f i g j 求a b b b 每一位模 n 1 的值,其中有 c 個 運算,n 1...