/*ACMer:MDK
2011-04-21 18:28:14 Accepted 1596 1703MS 8136K 1393 B G++ MDK
*/#include<iostream>
#include<string.h>
#include<stdio.h>
#include<vector>
#include<limits.h>
#define MAXN 1000
const int INTMAX=0x7f7f7f7f;
const int INTMIN=0x80808080;
using namespace std;
double mat[MAXN][MAXN],minl[MAXN];
void init()
{
memset(mat,127,sizeof(mat));
memset(minl,128,sizeof(minl));//这里要初始化最小
}
double dijkstra(int n,int a,int b)
{
int i,j,k;
int v[MAXN]={0};
memset(minl,128,sizeof(minl));//一开始这里网清零了。。。
for(minl[a]=1,j=0;j<n;j++)
{
for(k=-1,i=0;i<n;i++)
if(!v[i]&&(k==-1||minl[i]>minl[k]))
k=i;
for(v[k]=1,i=0;i<n;i++)
if(!v[i]&&(mat[k][i]!=INTMIN))
minl[i]=max(minl[k]*mat[k][i],minl[i]);
}
if(minl[b]<=-1)
return 0;
else
return minl[b];
}
int main()
{
freopen("d:\\1.txt","r",stdin);
int N;
while(scanf("%d",&N)!=EOF)
{
init();
for(int i = 0;i<N;i++)
{
for(int j = 0;j<N;j++)
{
scanf("%lf",&mat[i][j]);
}
}
int M;scanf("%d",&M);
for(int i =0;i<M;i++)
{
int a,b;
scanf("%d%d",&a,&b);
double tmp=dijkstra(N,a-1,b-1);
if(!tmp) printf("What a pity!\n");
else printf("%.3f\n",tmp);
}
}
}
一开始用的Floyd,又是果断超时。。。
打dijkstra代码的时候居然少打一个外循环,我真是蒙了!!什么玩意嘛~下次把清零函数放在dijkstra里面!