[BZOJ] 幸福路径

bzoj 2306

最短路水题,多次迭代就可以求得答案。
我在这里迭代了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;
}

posted @ 2017-12-15 20:00  FranceDisco  阅读(105)  评论(0编辑  收藏  举报