最短路程改为最大概率
之前的INF,min,三角不等式都需要修改
#include<iostream>
using namespace std;
#define INF 10000000
int N,visit[1010];
double mp[1010][1010],dist[1010];
double dij(int s,int t)
{
int i,j,k;
memset(visit,0,sizeof(visit)); visit[s]=1;
for(i=1;i<=N;i++) dist[i]=mp[s][i];
dist[s]=1;
double max;
k=s;
for(i=1;i<=N;i++)
{
max=0; //不是INF - -
for(j=1;j<=N;j++)
if(!visit[j]&&max<dist[j])
{
max=dist[j];
k=j;
}
visit[k]=1;
// printf("k=%d",k);
for(j=1;j<=N;j++)
if(!visit[j]&&dist[j]<dist[k]*mp[k][j])
dist[j]=dist[k]*mp[k][j];
// for(j=1;j<=N;j++)
// printf("\t%.4lf",dist[j]);
// printf("\n");
}
//printf("%.3lf\n",dist[t]);
return dist[t];
}
int main()
{
int i,j,n,s,t;
while(scanf("%d",&N)!=EOF)
{
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
scanf("%lf",&mp[i][j]);
scanf("%d",&n);
double x;
for(i=1;i<=n;i++)
{
scanf("%d%d",&s,&t);
x=dij(s,t);
if(x<0.0000001)
printf("What a pity!\n");
else
printf("%.3lf\n",x);
}
}
return 0;
}
/*
5
1 0.1 0.7 0.9 0
0.1 1 0 1 0.9
0.7 0 1 0.8 0.2
0.9 1 0.8 1 0.5
0 0.9 0.2 0.5 1
*/