最短路问题,使用 Dijkstra算法即可。
#include <cstdio>
#include <cstring>
const int MAXN = 1010;
double mp[MAXN][MAXN]; //地图
double dis[MAXN]; //起点到其它点的最大安全系数
bool vis[MAXN]; //结点访问情况
//Dijkstra算法,s:起点,e:终点,n:结点数量
double Dijkstra(int s, int e, int n)
{
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
{
dis[i] = mp[s][i];
}
vis[s] = true;
for (int i = 1; i <= n; i++)
{
double maxF = -1; //最大安全系数
int now = s;
for (int j = 1; j <= n; j++) //选择下一个结点
{
if (!vis[j] && dis[j] > maxF)
{
now = j;
maxF = dis[j];
}
}
vis[now] = true;
for (int j = 1; j <= n; j++) //更新最大安全系数
{
if (!vis[j] && dis[j] < dis[now] * mp[now][j])
dis[j] = dis[now] * mp[now][j];
}
if (now == e) //到达终点
return dis[e];
}
return 0;
}
int main()
{
int n, m;
while (scanf("%d", &n) != EOF)
{
memset(mp, 0, sizeof(mp));
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
scanf("%lf", &mp[i][j]);
}
}
int s, e;
scanf("%d", &m);
while (m--)
{
scanf("%d%d", &s, &e);
double len = Dijkstra(s, e, n);
if (len)
printf("%.3lf\n", len);
else
printf("What a pity!\n");
}
}
return 0;
}
继续加油。