這道題用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;
}