【BZOJ 2306】 2306: [Ctsc2011]幸福路径 (倍增floyd)
2306: [Ctsc2011]幸福路径
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 912 Solved: 437Description
有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i)。现在有一只蚂蚁,从
给定的起点 v0出发,沿着图 G 的边爬行。开始时,它的体力为 1。每爬过一条
边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数。而
蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积。
我们把蚂蚁在爬行路径上幸福度的总和记为 H。很显然,对于不同的爬行路
径,H 的值也可能不同。小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算
吗?注意,蚂蚁爬行的路径长度可能是无穷的。Input
每一行中两个数之间用一个空格隔开。
输入文件第一行包含两个正整数 n, m,分别表示 G 中顶点的个数和边的条
数。
第二行包含 n个非负实数,依次表示 n个顶点权值 w(1), w(2), …, w(n)。
第三行包含一个正整数 v0,表示给定的起点。
第四行包含一个实数 ρ,表示给定的小于 1的正常数。
接下来 m行,每行两个正整数 x, y,表示<x, y>是G的一条有向边。可能有
自环,但不会有重边。Output
仅包含一个实数,即 H值的最大可能值,四舍五入到小数点后一位。
Sample Input
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
Sample Output
18.0HINT
对于 100%的数据, n ≤ 100, m ≤ 1000, ρ ≤ 1 – 10^-6
, w(i) ≤ 100 (i = 1, 2, …, n)。Source
【分析】
无限长的路,但是p不断变小,所以做到足够精度也就可以了。
然后就是,用倍增来搞floyd。
$F[i][j][t]$表示从i走到j走了t步的最大收益,$F[i][j][t]=max(F[i][j][t-1]+F[i][j][t-1]*{p}^{t-1});$
这个滚动DP啦~~
做到$2^t$超越精度就好了。
【表示其实初始化那里有点迷人,我是看po姐的。。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 #define Maxn 110 8 #define Maxm 1100 9 #define LL long long 10 #define INF 0xfffffff 11 const double eps=1e-8; 12 13 double w[Maxn],f[Maxn][Maxn][2]; 14 double mymax(double x,double y) {return x>y?x:y;} 15 16 int main() 17 { 18 int n,m,st; 19 double p; 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;i++) scanf("%lf",&w[i]); 22 scanf("%d%lf",&st,&p); 23 memset(f,0xc2,sizeof(f)); 24 for(int i=1;i<=n;i++) f[i][i][0]=0; 25 for(int i=1;i<=m;i++) 26 { 27 int x,y; 28 scanf("%d%d",&x,&y); 29 f[x][y][0]=w[y]*p; 30 } 31 int nw=0; 32 for(double l=p;l>eps;l=l*l) 33 { 34 for(int i=1;i<=n;i++) 35 for(int j=1;j<=n;j++) 36 f[i][j][nw^1]=-INF; 37 for(int k=1;k<=n;k++) 38 for(int i=1;i<=n;i++) 39 for(int j=1;j<=n;j++) 40 { 41 f[i][j][nw^1]=mymax(f[i][j][nw^1],f[i][k][nw]+f[k][j][nw]*l); 42 } 43 nw^=1; 44 } 45 double ans=0; 46 for(int i=1;i<=n;i++) ans=mymax(ans,f[st][i][nw]); 47 printf("%.1lf\n",ans+w[st]); 48 return 0; 49 }
2017-04-05 15:56:06