题目链接:点击打开链接
题意描述:给定一张图,给出图中每条边的权值,求任意两点之间权值之积最大?
解题思路:最短路径floyd
求权之积:通过log可以转化为求权之和
求最大:通过取加符号转化为求最小
代码:
#include <cstdio>
#include <cmath>
#define MAXN 1010
#define eps 1e-8
using namespace std;
const double INF=1000010.0;
double dis[MAXN][MAXN];
int n,m;
double fabs(double x){
if(x>=-eps) return x;
return -x;
}
void floyd(){
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(dis[i][j]>dis[i][k]+dis[k][j]+eps)
dis[i][j]=dis[i][k]+dis[k][j];
}
int main(){
double tmp;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j){
scanf("%lf",&tmp);
if(fabs(tmp)<=eps)
dis[i][j]=INF;
else
dis[i][j]=-log(tmp);
}
floyd();
int m;
scanf("%d",&m);
int x,y;
while(m--){
scanf("%d%d",&x,&y);
if(dis[x][y]>=INF-eps)
printf("What a pity!\n");
else printf("%.3lf\n",exp(-dis[x][y]));
}
}
return 0;
}