zoukankan      html  css  js  c++  java
  • hdu 2686(状压dp)

    题目链接:http://poj.org/problem?id=2686

    思路:典型的状压dp题,dp[s][v]表示到达剩下的车票集合为S并且现在在城市v的状态所需要的最小的花费。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 #define inf 1<<30
     7 
     8 int n,m,p,a,b;
     9 int t[11];
    10 int map[44][44];
    11 double dp[1<<11][44];//到达剩下的车票集合为S,并且现在在城市v的状态所需要的最小的花费
    12 
    13 int main()
    14 {
    15     int u,v,w;
    16     while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)){
    17         if(n==0&&m==0&&p==0&&a==0&&b==0)break;
    18         for(int i=0;i<m;i++)
    19             for(int j=0;j<m;j++)
    20                 map[i][j]=(i==j)?0:inf;
    21         for(int i=0;i<n;i++)scanf("%d",&t[i]);
    22         while(p--){
    23             scanf("%d%d%d",&u,&v,&w);
    24             map[u-1][v-1]=w;
    25             map[v-1][u-1]=w;
    26         }
    27         for(int state=0;state<(1<<n);state++){
    28             fill(dp[state],dp[state]+m,inf);
    29         }
    30         dp[(1<<n)-1][a-1]=0;
    31         double ans=inf;
    32         for(int state=(1<<n)-1;state>=0;state--){
    33             ans=min(ans,dp[state][b-1]);
    34             for(int u=0;u<m;u++){
    35                 for(int i=0;i<n;i++){
    36                     if((state>>i)&1){
    37                         for(int v=0;v<m;v++){
    38                             if(map[u][v]<inf&&dp[state][u]<inf){
    39                                 dp[state&~(1<<i)][v]=min(dp[state&~(1<<i)][v],dp[state][u]+(double)map[u][v]/t[i]);
    40                             }
    41                         }
    42                     }
    43                 }
    44             }
    45         }
    46         if(ans==inf){
    47             puts("Impossible");
    48         }else 
    49             printf("%.3f
    ",ans);
    50     }
    51     return 0;
    52 }
    53 
    54 
    55             
    56         
    57         
    View Code
  • 相关阅读:
    HDU_2191_多重背包
    HDU_1494_dp
    POJ_1088_dfs
    所有的畅通工程[HDU1232][HDU1874][HDU1875][HDU1879]
    畅通工程[HDU1863]
    还是畅通工程[HDU1233]
    最小生成树
    Who's in the Middle[HDU1157]
    Bungee Jumping[HDU1155]
    Is It A Tree?[HDU1325][PKU1308]
  • 原文地址:https://www.cnblogs.com/wally/p/3306145.html
Copyright © 2011-2022 走看看