POJ-2686-Traveling by Stagecoach

来源:互联网 发布:滁州淘宝服饰 编辑:程序博客网 时间:2024/05/16 12:51

求a到b的最小花费,其中加了一些其他的因素,比如可以坐马车。

用动态规划和状态压缩就可以解决,每次的状态值需要记录到达某地和所剩的票数

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=1<<10;const int maxm=31;const int inf=1<<29;int n,m,p,a,b,map[maxm][maxm],t[maxm];double dp[maxn][maxm];int main(){    while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF)    {if(!n&&!m)    break;memset(map,0,sizeof(map));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);    map[u][v]=map[v][u]=c;}for(int i=0;i<(1<<n);i++)    fill(dp[i],dp[i]+m+1,inf);dp[(1<<n)-1][a]=0;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(map[u][v])    {dp[i^(1<<j)][v]=min(dp[i^(1<<j)][v],dp[i][u]+map[u][v]*1.0/t[j]);    }}double ans=inf;for(int i=0;i<(1<<n);i++)    ans=min(ans,dp[i][b]);if(ans==inf)    printf("Impossible\n");else    printf("%.3f\n",ans);    }    return 0;}


0 0