被踩爆*2
这个题看起来就很乱搞,因为这个精度要求。。。(开始还猜了个一直转圈圈就可以等比数列了,然而好像很假)
反正还是无从下手
结果居然是倍增floyd,滚一维表示走了2^t步时的最大幸福度
注意初始时自己到自己幸福度为0
#include#include #include #include #include #include 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;}