#include
#include
#include
using namespace std;
const int maxn=1<<10;
const int maxm=31;
const int INF=1<<29;
int t[maxm];
int d[maxm][maxm];
double dp[maxn][maxm];
void solve()
{
for(int i=0;i<(1<<n);i++)
fill(da[i],dp[i]+m+1,INF);
dp[(1<<n)-1][a]=0;
double res=INF;
for(int i=(1<<n)-1;i>=0;i–)
for(int u=1;u<=m;u++)
for(int j=0;j<n;j++)
if(i&(1<<j))
for(int v=1;v<=m;v++)
if(d[v][u])
dp[i&(1<<j)][v]=min(dp[i&(1<<j)][v],dp[i][u]+(double)d[u][v]/t[j]);
for(int i=0;i<(1<<n);i++)res=min(res,dp[i][b]);
if(res==INF)printf(“Impossible”);
else printf("%.3f",res);
}
int main()
{
while(scanf("%d %d %d %d %d",&n,&m,&p,&a,&b)!=EOF){
if(!m&&!n)break;
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
scanf("%d",t+i);
for(int i=0;i<p;i++){
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
d[u][v]=d[v][u]=c;
}
solve();
}
return 0;
}
边数受限的最短路(状态压缩DP)
最新推荐文章于 2024-05-04 20:43:03 发布