此题可以利用求最短路径的思想来解决,贪心的过程每次找最大值即可。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <assert.h>
#include <time.h>
typedef long long LL;
const int INF = 500000001;
const double EPS = 1e-9;
const double PI = acos(-1.0);
using namespace std;
int n, s, e, vis[1001];
double graph[1001][1001], dis[1001];
void Dijkstra()
{
memset(vis, -1, sizeof(vis));
for(int i = 1; i <= n; i++)
{
dis[i] = graph[s][i];
}
vis[s] = 0;
for(int i = 1; i < n; i++)
{
double maxx = 0;
int k = -1;
for(int j = 1; j <= n; j++)
{
if(vis[j] == -1 && maxx < dis[j])
{
maxx = dis[j];
k = j;
}
}
if(k == -1) break;
vis[k] = 0;
for(int j = 1; j <= n; j++)
{
if(vis[j] == -1 && dis[j] < dis[k] * graph[k][j])
{
dis[j] = dis[k] * graph[k][j];
}
}
}
}
int main()
{
#ifdef _T1est
freopen("test0.in", "r", stdin);
freopen("test0.out", "w", stdout);
srand(time(NULL));
#endif
int Q;
while(~scanf("%d", &n))
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
scanf("%lf", &graph[i][j]);
}
}
scanf("%d", &Q);
while(Q--)
{
scanf("%d %d", &s, &e);
Dijkstra();
if(dis[e])
printf("%.3f\n", dis[e]);
else
printf("What a pity!\n");
}
}
return 0;
}