判断 最小和 变成判断 最大乘积
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
double dis[1010][1010],d[1010];
int n,m,vis[1010];
void dij(int a,int b)
{
double mm;
int k,i,j;
memset(vis,0,sizeof vis);
for(i=0;i<n;i++)
d[i]=dis[a][i];
d[a]=1;vis[a]=1;
for(i=0;i<n;i++)
{
mm=0;k=b;
for(j=0;j<n;j++)
{
if(!vis[j]&&d[j]>mm)
{
mm=d[j];
k=j;
}
}
if(k==b) break;
vis[k]=1;
for(j=0;j<n;j++)
{
if(!vis[j]&&(dis[k][j]*mm>d[j]))
d[j]=mm*dis[k][j];
}
}
}
int main()
{
int i,j,u,v;
while(~scanf("%d",&n))
{
memset(dis,0,sizeof dis);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&dis[i][j]);
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d%d",&u,&v);
dij(u-1,v-1);
if(d[v-1]==0) printf("What a pity!\n");
else printf("%.3lf\n",d[v-1]);
}
}
return 0;
}