把到起点的距离初始化为0,起点到起点的初始化为1.把dijstra里的加号改成乘号就OK了。
最后再加一句,水题。
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
const int maxn=1005,inf=1<<29;
int n,m,s,e;
int vis[maxn];
double d[maxn];
double Map[maxn][maxn];
void Dijkstra()
{
fill(vis,vis+maxn,0);
fill(d,d+maxn,0);
d[s]=1.0;
while(1)
{
int v=-1;
for(int i=1;i<=n;i++)
if(!vis[i]&&(v==-1||d[v]<d[i])) v=i;
if(v==-1) break;
vis[v]=1;
for(int i=1;i<=n;i++) d[i]=max(d[i],d[v]*Map[v][i]);
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%lf",&Map[i][j]);
scanf("%d",&m);
while(m--)
{
cin>>s>>e;
Dijkstra();
if(d[e]==0) printf("What a pity!\n");
else printf("%.3lf\n",d[e]);
}
}
return 0;
}