//状态压缩实际上是将一个集合用一个数来表示
#include<stdio.h>
#include<string>
#include<vector>
using namespace std;
#define INF 1<<30
#define MAX_N 10
#define MAX_M 40
//输入
int n,m,a,b,p;
int t[MAX_N];
int d[MAX_M][MAX_M]; //图的邻接矩阵表示(-1表示没有边)
//dp[S][v]:=到达剩下的车票集合为S并且现在在城市v的状态所需要的最小花费
double dp[1<<MAX_N][MAX_M];
double min(double a,double b) {
return a<b?a:b;
}
void solve() {
int i,u,v,S;
for(i=0;i< (1<<n);i++) {
fill(dp[i],dp[i]+m,INF); //用足够大的值初始化
}
dp[(1<<n)-1][a-1]=0;
double res=INF;
for(S=(1<<n)-1;S>=0;S--) {
res=min(res,dp[S][b-1]);
for(v=0;v<m;v++) {
for(i=0;i<n;i++) {
if (S>>i &1) {
for(u=0;u<m;u++) {
if (d[v][u]>=0) {
//使用车票i,从v移动到u
dp[S& ~(1<<i)][u]=min(dp[S&~(1<<i)][u],dp[S][v]+(double)d[v][u]/t[i]);
}
}
}
}
}
}
if (res==INF) {
//无法到达
printf("Impossible\n");
}
else {
printf("%.3f\n",res);
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int i,x,y,z;
while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF && n!=0) {
memset(d,-1,sizeof(d));
for(i=0;i<n;i++) scanf("%d",&t[i]);
for(i=0;i<p;i++) {
scanf("%d%d%d",&x,&y,&z);
d[x-1][y-1]=z;
//无向图
d[y-1][x-1]=z;
}
solve();
}
return 0;
}
POJ 2686 Traveling by Stagecoach
最新推荐文章于 2019-07-07 13:57:21 发布