题解:
倍增
Floyd
F
l
o
y
d
。
令
f[t][i][j]
f
[
t
]
[
i
]
[
j
]
表示走
2t
2
t
步,从
i
i
走到获得的最大幸福度。
f[t][i][j]=max(f[t−1][i][k]+f[t−1][k][j]∗p2t−1)
f
[
t
]
[
i
]
[
j
]
=
m
a
x
(
f
[
t
−
1
]
[
i
]
[
k
]
+
f
[
t
−
1
]
[
k
]
[
j
]
∗
p
2
t
−
1
)
当
t
t
足够大时, 得到的就近似为最大的幸福值。
Code:
C
o
d
e
:
#include<bits/stdc++.h>
#define N 229
#define inf 1000000000
using namespace std;
int n,m,s,u,v;
double a[N],p,f[62][N][N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
scanf("%d%lf",&s,&p);
for(int k=0;k<=60;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)f[k][i][j]=-inf;
for(int i=0;i<=n;i++)f[0][i][i]=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
f[0][u][v]=a[v]*p;
}
for(int t=1;t<=60;t++)
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[t][i][j]=max(f[t][i][j],f[t-1][i][k]+f[t-1][k][j]*p);
p*=p;
}
double ans=-inf;
for(int i=1;i<=n;i++)ans=max(ans,f[60][s][i]);
printf("%.1lf\n",ans+a[s]);
return 0;
}