http://acm.hdu.edu.cn/showproblem.php?pid=1596
分析:乘积,注意初始化即可
#include<iostream>
#include<cstdio>
using namespace std;
const int NM=1005;
const int MAX=0;
double a[NM][NM],p[NM];
int n;
bool flag[NM];
void Dis(int s,int t)
{
int i,j,k;
double mmin;
memset(flag,0,sizeof(flag));
memset(p,0,sizeof(p)); //
for(i=1;i<=n;i++)
p[i]=a[s][i];
p[s]=1,flag[s]=1; //
for(i=1;i<n;i++)
{
mmin=MAX;
for(j=1;j<=n;j++)
{
if(!flag[j]&&mmin<p[j])
{
k=j;
mmin=p[j];
}
}
if(mmin==MAX) break;
flag[k]=1;
for(j=1;j<=n;j++)
{
if(!flag[j]&&p[j]<p[k]*a[k][j])
p[j]=p[k]*a[k][j];
}
}
if(p[t]>0) printf("%.3lf\n",p[t]);
else printf("What a pity!\n");
}
int main()
{
int i,j,s,t,q;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%lf",&a[i][j]);
}
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d%d",&s,&t);
Dis(s,t);
}
}
return 0;
}