水题~
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=1024;
struct zz
{
int x;
int y;
}zx[maxn];
float a[maxn][maxn];
float b[maxn][maxn];
bool vis[maxn];
int n,m,x,y,now;
float temp;
vector<int>g[maxn];
vector<int>v[maxn];
queue<int>q;
void build()
{
for(int i=1;i<=n;i++)
{
g[i].clear();
v[i].clear();
for(int j=1;j<=n;j++)
{
if(j==i)
{
continue;
}
if(a[i][j])
{
g[i].push_back(j);
}
}
}
return ;
}
void spfa(int x)
{
while(!q.empty())
{
q.pop();
}
memset(vis,false,sizeof(vis));
vis[x]=true;
q.push(x);
a[x][x]=1.0;
b[x][x]=1.0;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<g[now].size();i++)
{
temp=b[x][now]*a[now][g[now][i]];
if(temp > b[x][g[now][i]])
{
b[x][g[now][i]]=temp;
if(!vis[g[now][i]])
{
vis[g[now][i]]=true;
q.push(g[now][i]);
}
}
}
vis[now]=false;
}
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
b[i][j]=0;
scanf("%f",&a[i][j]);
}
}
build();
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&zx[i].x,&zx[i].y);
v[zx[i].x].push_back(zx[i].y);
}
for(int i=1;i<=n;i++)
{
if(v[i].size())
{
spfa(i);
}
}
for(int i=1;i<=m;i++)
{
if(b[zx[i].x][zx[i].y])
{
printf("%.3f\n",b[zx[i].x][zx[i].y]);
}
else
{
printf("What a pity!\n");
}
}
}
return 0;
}