bzoj 2306: [Ctsc2011]幸福路径
2017-10-06 11:28
513 查看
题意:
有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i)。现在有一只蚂蚁,从给定的起点 v0出发,沿着图 G 的边爬行。开始时,它的体力为 1。每爬过一条边,它的体力都*p,而蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积。 求最大幸福值。
题解:
因为当体力很小后,对答案就没什么影响力,所以用一个玄学的倍增floyd卡精度就能过。设f[i][j][t]表示i到j走2t步的最大幸福值。
那么有f[i][j][t]=max{f[i][k][t−1]+f[k][j][t−1]∗p2t}
然后就过了。
code:
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; const double eps=1e-10; int n,m; double f[110][110],g[110][110]; double w[110],p; int main() { scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%lf",&w[i]); int st=0;scanf("%d %lf",&st,&p); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i!=j) f[i][j]=-1e15; for(int i=1;i<=m;i++) { int x,y;scanf("%d %d",&x,&y); f[x][y]=w[y]*p; } for(;p>eps;p*=p) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=-1e15; for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) g[i][j]=max(g[i][j],f[i][k]+f[k][j]*p); memcpy(f,g,sizeof(f)); } double ans=0; for(int i=1;i<=n;i++) ans=max(ans,f[st][i]); printf("%.1lf",ans+w[st]); }
相关文章推荐
- BZOJ 2306 Ctsc2011 幸福路径 倍增Floyd
- bzoj 2306: [Ctsc2011]幸福路径
- BZOJ 2306: [Ctsc2011]幸福路径
- BZOJ 2306 [Ctsc2011] 幸福路径 [倍增+floyd做法]
- BZOJ2306/Ctsc2011 幸福路径
- 【BZOJ 2306】 2306: [Ctsc2011]幸福路径 (倍增floyd)
- BZOJ 2306 [Ctsc2011] 幸福路径 [期望DP做法]
- bzoj 2306: [Ctsc2011]幸福路径 倍增+floyed
- [bzoj]2306: [Ctsc2011]幸福路径
- 2306: [Ctsc2011]幸福路径
- 【BZOJ2306】[Ctsc2011]幸福路径 倍增Floyd
- 【bzoj2360】【cstc2011】【幸福路径】【倍增+floyd】
- BZOJ2306 [Ctsc2011]幸福路径
- [CTSC2011]幸福路径
- BZOJF2306 [Ctsc2011]幸福路径
- bzoj2306 [Ctsc2011]幸福路径
- BZOJ 2306 幸福路径(DP)
- 【Ctsc2011】幸福路径
- 【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd
- bzoj 2306 幸福路径 【floyd】【dp】