有向圖 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值的最大可能值,四捨五入到小數點後一位。
輸入樣例#1: 複製
5 510.0 8.0 8.0 8.0 15.0
1 0.5
1 2
2 3
3 4
4 2
4 5
輸出樣例#1: 複製
18.0
對於 100%的資料, n ≤ 100, m ≤ 1000, ρ ≤ 1 – 10^-6, w(i) ≤ 100 (i = 1, 2, …, n)。
因為保留一位小數,且w(i)<=100
所以當$p^k$<1e-4時可無視
也就是說,當邊數大於k時就可以忽略不計
k最大為:
$log_1e-4$約等於$10^7$
所以用倍增floyd求最大值
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7double f[26][101][101],w[101],inf=2e18,p,ans;
8int
n,m,s;
9int
main()
10 16 cin>>s;
17for (i=0;i<=25;i++)
18for (j=1;j<=n;j++)
19for (k=1;k<=n;k++)
20 f[i][j][k]=-inf;
21for (i=1;i<=n;i++)
22 f[0][i][i]=0
;23 scanf("
%lf",&p);
24for (i=1;i<=m;i++)
2529
for (t=1;t<=25;t++)
3039
}40 p=p*p;41}
42 ans=-inf;
43for (i=1;i<=n;i++)
44 ans=max(ans,f[25][s][i]+w[s]);
45 printf("
%.1lf\n
",ans);
46 }
CTSC2011 幸福路徑
給定 張有向圖,每個點有個權值,螞蟻從某個點開始,初始體 為1,每經過 條邊,體 會變為原來的p 0 n leq 100,點權 leq 100 sol 正解是自動機的幫浦引理,一看就不可做,考慮暴力碾標算 由於點權不超過 100,體力很小的時候點權的貢獻也很小,保留一位小數就會把很小的貢獻捨去 做乙...
bzoj 2306 Ctsc2011 幸福路徑
有向圖 g有n個頂點 1,2,n,點i 的權值為 w i 現在有乙隻螞蟻,從 給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都 p,而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。求最大幸福值。因為當體力很小後,對答案就沒什麼影響力,所以用乙...
bzoj2306 Ctsc2011 幸福路徑
有向圖 g有n個頂點 1,2,n,點i 的權值為 w i 現在有乙隻螞蟻,從給定的起點 v0出發,沿著圖 g 的邊爬行。開始時,它的體力為 1。每爬過一條邊,它的體力都會下降為原來的 倍,其中 是乙個給定的小於1的正常數。而螞蟻爬到某個頂點時的幸福度,是它當時的體力與該點權值的乘積。我們把螞蟻在爬行...