您的位置:首页 > 其它

poj 2686 Traveling by Stagecoach(状压dp)

2014-07-26 15:14 351 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define max_n 100005
#define mod 1000000007
double t[max_n];
double dp[1<<10][100];
double d[105][105];
int n,m,a,b,p;
void init()
{
for(int i=0;i<105;i++)
{
for(int j=0;j<105;j++)
d[i][j]=inf;
}
for(int i=0;i<1<<n;i++)
{
fill(dp[i],dp[i]+m,inf);
}
}
int main()
{
while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b))
{
if(n==m && m==p && p==0)
break;
init();
for(int i=0;i<n;i++)
scanf("%lf",&t[i]);
for(int i=0;i<p;i++)
{
int x,y;
double val;
scanf("%d%d%lf",&x,&y,&val);
x--;
y--;
d[x][y]=min(d[x][y],val);
d[y][x]=min(d[y][x],val);
}
dp[(1<<n)-1][a-1]=0;
double ans=inf;
for(int s=(1<<n)-1;s>=0;s--)
{
ans=min(ans,dp[s][b-1]);
for(int v=0;v<m;v++)
{
for(int i=0;i<n;i++)
{
if(s>>i&1)
{
for(int u=0;u<m;u++)
{
if(d[v][u]!=inf)
dp[s&~(1<<i)][u]=min(dp[s&~(1<<i)][u],dp[s][v]+d[v][u]/t[i]);
}
}
}
}
}
if(ans==inf)
printf("Impossible\n");
else
printf("%.3f\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: