bzoj2306: [Ctsc2011]幸福路径
被踩爆*2
这个题看起来就很乱搞,因为这个精度要求。。。(开始还猜了个一直转圈圈就可以等比数列了,然而好像很假)
反正还是无从下手
结果居然是倍增floyd,滚一维表示走了2^t步时的最大幸福度
注意初始时自己到自己幸福度为0
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int _=10; const int maxn=1e2+_; const int maxm=1e3+_; const double eps=1e-10; int n; double w[maxn],mp[2][maxn][maxn]; void mem(int now) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[now][i][j]=-(1<<30); for(int i=1;i<=n;i++)mp[now][i][i]=0; } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); int m,st,x,y;double ro; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%lf",&w[i]); scanf("%d%lf",&st,&ro); int now=0;mem(now); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); mp[now][x][y]=w[y]*ro; } for(;ro>eps;ro*=ro) { now^=1;mem(now); for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[now][i][j]=max(mp[now][i][j],mp[now^1][i][k]+mp[now^1][k][j]*ro); } double ans=0; for(int i=1;i<=n;i++) ans=max(ans,mp[now][st][i]); printf("%.1lf\n",ans+w[st]); return 0; }
pain and happy in the cruel world.