题意:
给出矩阵,是i->j的安全系数,询问从s->t的安全系数最高是多少, 系数是满足*法
思路:
建立dijkstra跑最长路
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
using namespace std;
const int maxn=1005;
double mp[maxn][maxn];
double ans[maxn];
struct node{
int u;
double d;
node( int _u,double _d)
{
u=_u,d=_d;
}
bool friend operator <(node x, node y)
{
return x.d<y.d;
}
};
double dis[maxn];
int n,m;
int vis[maxn];
void dijk(int s,int t)
{
for(int i=1;i<=n;i++)
{
vis[i]=0;
dis[i]=0;
}
priority_queue <node >q;
q.push(node (s,1));
dis[s]=1;
while(!q.empty())
{
node tp=q.top();
int u=tp.u;
q.pop();
if(t==u) return ;
if(vis[u]) continue;
vis[u]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]<dis[u]*mp[u][i])
{
q.push(node (i,dis[u]*mp[u][i]));
dis[i]=dis[u]*mp[u][i];
}
}
}
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%lf",&mp[i][j]);
}
int q;
scanf("%d",&q);
while(q--)
{
int s,t;
scanf("%d%d",&s,&t);
dijk(s,t);
if(dis[t]<1e-8)
printf("What a pity!\n");
else printf("%.3lf\n",dis[t]);
}
}
}