poj 2686 Traveling by Stagecoach(状压dp)

来源:互联网 发布:成都网络服务器租用 编辑:程序博客网 时间:2024/05/16 11:55
#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 1000000007double 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;}


0 0