最短路水题,多次迭代就可以求得答案。
我在这里迭代了100下,应该很安全了orz
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 110;
int n,m,s;
double ans,g[N][N],a[N],f[N][N],p;
int main(){
int i,j,k,T,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%lf",&a[i]);
scanf("%d %lf",&s,&p);
memset(f,0xc2,sizeof f);
for(i=1;i<=n;i++) f[i][i]=0;
for(i=1;i<=m;i++){
scanf("%d%d",&x,&y);
f[x][y]=a[y];
}
double temp = p;
for(T = 0 ; T <= 100 ; T++,temp*=temp){
memset(g,0xc2,sizeof g);
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g[i][j]=max(g[i][j],f[i][k]+f[k][j]*temp);
memcpy(f,g,sizeof f);
}
for(i=1;i<=n;i++)
ans = max(ans , f[s][i]);
printf("%.1lf\n",ans * p +a[s]);
return 0;
}