1.题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1596
2.思路:
这道题目是求最短路的变行题,此题说明最短路也能求最大值(最大安全系数)。
本来这道题目我是用dijkstra算法做的,然后不知道哪里不对,老是WA,后来我就换了个算法用floyd算法,但是由于一个细节没有处理好,一直TLE,坑死了,后来发现是一个细节,我去,动买叼。。无力吐槽 !!!
3.参考代码:
#include <stdio.h>
#include <string.h>
#define inf 0xffff
int n,m; ///n为点数,m为边数
int s,e; ///s为起点,e为终点
double dis[1100][1100];
/*
double Max(double x,double y){
return x>y?x:y;
}*/
void floyd(){ ///floyd算法
int i,j,k; ///循环变量
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
///按照题目的要求安全系数越高越好,并且安全系数是相乘的
if(dis[i][j]<dis[i][k]*dis[k][j]) ///核心代码
dis[i][j]=dis[i][k]*dis[k][j]; ///安全系数越高越好
///dis[i][j]=Max(dis[i][j],dis[i][k]*dis[k][j]);
///这题一定不能这么写,否则会像我一样一直超时,我也不知道
///不知道什么原因,有知道的可以解释下嘛?
}
}
}
}
int main()
{
int i,j; ///循环变量
while(~scanf("%d",&n))
{
for(i=0;i<=n;i++) ///初始化
{
for(j=0;j<=n;j++)
dis[i][j]=dis[j][i]=inf;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%lf",&dis[i][j]);
}
floyd();
scanf("%d",&m);
while(m--)
{
scanf("%d %d",&s,&e);
if(dis[s][e])
printf("%.3lf\n",dis[s][e]);
else
printf("What a pity!\n");
}
}
return 0;
}