• Traveling by Stagecoach 状态压缩裸题


                                  Traveling by Stagecoach

    dp[s][v]  从源点到达  v,状态为s,v的最小值。  for循环枚举就行了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <string>
     7 #include <vector>
     8 #include <set>
     9 #include <map>
    10 #include <stack>
    11 #include <queue>
    12 #include <sstream>
    13 #include <iomanip>
    14 using namespace std;
    15 typedef long long LL;
    16 const double INF=0x4fffffff;
    17 const double EXP=1e-5;
    18 const int MS=10;
    19 const int SIZE=31;
    20 
    21 double dp[1<<MS][SIZE];
    22 
    23 int edges[SIZE][SIZE];
    24 int cnt[MS];
    25 
    26 int start,final,tickets,citys,edge;
    27 
    28 void solve()
    29 {
    30       for(int i=0;i<(1<<tickets);i++)
    31             fill(dp[i],dp[i]+SIZE,INF);
    32       dp[(1<<tickets)-1][start-1]=0;
    33       double res=INF;
    34       for(int i=(1<<tickets)-1;i>=0;i--)
    35       {
    36             res=min(res,dp[i][final-1]);
    37             for(int u=0;u<citys;u++)
    38             {
    39                   for(int j=0;j<tickets;j++)
    40                   {
    41                         if((i>>j)&1)
    42                         {
    43                               for(int v=0;v<citys;v++)
    44                                     if(edges[u][v]>=0)
    45                                     dp[i-(1<<j)][v]=min(dp[i-(1<<j)][v],dp[i][u]+double(edges[u][v])/cnt[j]);
    46                         }
    47                   }
    48             }
    49       }
    50       if(res+EXP>=INF)
    51             printf("Impossible
    ");
    52       else
    53             printf("%.3lf
    ",res);
    54 }
    55 
    56 int main()
    57 {
    58       while(scanf("%d%d%d%d%d",&tickets,&citys,&edge,&start,&final)==5&&tickets)
    59       {
    60 
    61             for(int i=0;i<tickets;i++)
    62             {
    63                   scanf("%d",&cnt[i]);
    64             }
    65             memset(edges,-1,sizeof(edges));
    66             for(int i=0;i<edge;i++)
    67             {
    68                   int x,y,z;
    69                   scanf("%d%d%d",&x,&y,&z);
    70                   edges[x-1][y-1]=edges[y-1][x-1]=z;
    71             }
    72             solve();
    73       }
    74       return 0;
    75 }
  • 相关阅读:
    flex布局
    input框不能输入问题
    JS的innerHTML完成注册表
    CSS的z-index属性和box-shadow属性
    JS个人笔记
    css照片墙
    透明度设置
    a标签的name属性
    iframe标签
    title属性
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4394022.html
Copyright © 2020-2023  润新知