这道题用Floyd和dijkstra均可以解出。
将各条路径的成绩值维护一下即可,也可以对各条路上的权值取对数,这样所有的路都变成了负值。找乘积的最大值,也就是找负值的最大值即可,贴出第一种方法的AC代码:
#include<iostream>
#include<stdio.h>
using namespace std;
double safe[1010][1010];
//double map[1010][1010];
int n;
void floyd()
{
for(int k = 0 ; k < n;k++)
for(int i = 0 ; i < n;i++)
for(int j = 0 ; j < n;j++)
if(safe[i][k]*safe[k][j] > safe[i][j])
safe[i][j] = safe[i][k]*safe[k][j];
}
int main()
{
while(~scanf("%d",&n))
{
for(int i = 0 ; i < n;i++)
for(int j = 0 ; j< n;j++)
{
scanf("%lf",&safe[i][j]);
}
floyd();
int k;
scanf("%d",&k);
while(k--)
{
int x,y;
cin>>x>>y;
x--,y--;
if(safe[x][y])
printf("%.3lf",safe[x][y]);
else
printf("What a pity!");
puts("");
}
}
return 0;
}