hdu1596 find the safest road(最短路径floyd)

来源:互联网 发布:网络大电影监禁风暴 编辑:程序博客网 时间:2024/06/11 15:42

题目链接:点击打开链接

题意描述:给定一张图,给出图中每条边的权值,求任意两点之间权值之积最大?


解题思路:最短路径floyd

求权之积:通过log可以转化为求权之和

求最大:通过取加符号转化为求最小


代码:

#include <cstdio>#include <cmath>#define MAXN 1010#define eps 1e-8using 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;}


0 0
原创粉丝点击