将车票的使用情况用二进制表示状态,对其进行转移即可。

但是我一开始写的代码是错误的(注释部分),看似思路是正确的,但是暗藏很大的问题。

枚举S,我们要求解的是dp[S][v],这个是从u转移过来的,不可以写成dp[S|(1<<i)][v]。这也是一次惨痛的教训......

 1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const double INF=0x3f3f3f3f;
6 double ans;
7 int n,m,p,a,b;
8 int t[20];
9 int dis[50][50];
10 double dp[1<<10][32];//dp[s][u]表示到达当前u点(使用s的车票)的最小花费
11
12 void solve(){
13 //memset(dp,0x3f,sizeof(dp));//整型数赋值,不可以
14 for(int i=0;i<(1<<(n+1));i++)
15 fill(dp[i],dp[i]+m+1,INF);
16 dp[0][a]=0;
17 ans=INF;
18 for(int S=0;S<(1<<n);S++){
19 for(int u=1;u<=m;u++)
20 for(int i=0;i<n;i++)
21 if((S>>i)&1)//使用i车票
22 for(int v=1;v<=m;v++)
23 if(dis[u][v]>=0)
24 dp[S][v]=min(dp[S][v],dp[S&~(1<<i)][u]+dis[u][v]/(double)t[i]);
25 ans=min(ans,dp[S][b]);
26 }
27 }
28
29 /*void solve(){ //错误代码
30 //memset(dp,0x3f,sizeof(dp));//整型数赋值,不可以
31 for(int i=0;i<(1<<(n+1));i++)
32 fill(dp[i],dp[i]+m+1,INF);
33 dp[0][a]=0;
34 ans=INF;
35 for(int S=0;S<(1<<n);S++){
36 for(int u=1;u<=m;u++)
37 for(int i=0;i<n;i++)
38 if(!(S>>i)&1)//未使用i车票
39 for(int v=1;v<=m;v++)
40 if(dis[u][v]>=0)
41 dp[S|(1<<i)][v]=min(dp[S|(1<<i)][v],dp[S][u]+dis[u][v]/(double)t[i]);
42 ans=min(ans,dp[S][b]);
43 }
44 }*/
45
46 int main(){
47 while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)){
48 if(n+m+p+a+b==0) break;
49 for(int i=0;i<n;i++) scanf("%d",&t[i]);
50 memset(dis,-1,sizeof(dis));
51 for(int i=0;i<p;i++){
52 int u,v,w;
53 scanf("%d%d%d",&u,&v,&w);
54 dis[u][v]=dis[v][u]=w;
55 }
56 solve();
57 if(ans==INF) printf("Impossible\n");
58 else printf("%.3f\n",ans);
59 }
60 return 0;
61 }

POJ2686 Traveling by Stagecoach (状压DP)的更多相关文章

  1. POJ 2686 Traveling by Stagecoach (状压DP)

    题意:有一个人从某个城市要到另一个城市, 有n个马车票,相邻的两个城市走的话要消耗掉一个马车票.花费的时间呢,是马车票上有个速率值 ,问最后这个人花费的最短时间是多少. 析:和TSP问题差不多,dp[ ...

  2. Traveling by Stagecoach /// 状压DP oj22914

    题目大意: 输入n,m,p,a,b n是车票数(1<=n<=8),m是城市数(2<=m<=30) p是路径数(可能为0),a是起点,b是终点 接下来一行有n个数 为每张车票的马 ...

  3. POJ 2686 Traveling by Stagecoach 壮压DP

    大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...

  4. POJ2686 Traveling by Stagecoach 状态压缩DP

    POJ2686 比较简单的 状态压缩DP 注意DP方程转移时,新的状态必然数值上小于当前状态,故最外层循环为状态从大到小即可. #include <cstdio> #include < ...

  5. 【状压DP】poj2686 Traveling by Stagecoach

    状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可. #include<cstdio> #include< ...

  6. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  7. codeforces 21D. Traveling Graph 状压dp

    题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...

  8. poj2686 状压dp入门

    状压dp第一题:很多东西没看懂,慢慢来,状压dp主要运用了位运算,二进制处理 集合{0,1,2,3,....,n-1}的子集可以用下面的方法编码成整数 像这样,一些集合运算就可以用如下的方法来操作: ...

  9. TSP问题之状压dp法

    首先,我们先来认识一下什么叫做TSP问题 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人 ...

  10. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

随机推荐

  1. go将青龙面板里面的脚本文件都下载到本地

    纯粹练手用的,大家轻喷 青龙面板的脚本文件可以下载到本地,这样的话自己可以研究一下对应的脚本文件,能学到更多的知识,原理其实很简单,F12一下就知道了,青龙面板使用Request Headers里面放 ...

  2. 我又造了个轮子:GrpcGateway

    我个人对GRPC是比较感兴趣的,最近在玩通过前端调用GRPC.通过前端调用GRPC业界有两种方式:GRPC Web和GRPC JSON转码. GRPC Web 通过JS或者Blazor WASM调用G ...

  3. 聚是一团火散作满天星,前端Vue.js+elementUI结合后端FastAPI实现大文件分片上传

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_175 分片上传并不是什么新概念,尤其是大文件传输的处理中经常会被使用,在之前的一篇文章里:python花式读取大文件(10g/50 ...

  4. 关于hive分区,你知道多少呢?

    ​ 文末查看关键字,回复赠书 一.理论基础 1.Hive分区背景 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入 ...

  5. JPA作持久层操作

    JPA(Hibernate是jpa的实现) jpa是对实体类操作,从而通过封装好的接口直接设置数据库的表结构.虽然jpa可以直接通过编写java代码来操作数据库表结构,避免了sql的编写,但别忘了需要 ...

  6. html弹出二选一窗口,然后根据点击执行对应的js方法

    html弹出二选一窗口,然后根据点击执行对应的js方法 layer.confirm("我是弹出来的字", {btn:['确认','取消']}, function(){ ...方法1 ...

  7. virtio_net设备的校验和问题

    我们来看一个virtio_net设备的校验和配置: [root@10 ~]# ethtool -K eth0 tx-checksumming on //caq:大写的K用来调整feature [roo ...

  8. MySQL事务概念与流程和索引控制

    MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...

  9. 【C++】实现D3D9 的 Inline hook

    [C++]实现D3D9 的 Inline hook   简单介绍一下HOOK原理: 函数调用的过程大致是 先push 参数 进去,再执行 call 函数地址 ,进入函数.此时将所调用的函数的前五个字节 ...

  10. 记一次 .NET 某金融企业 WPF 程序卡死分析

    一:背景 1. 讲故事 前段时间遇到了一个难度比较高的 dump,经过几个小时的探索,终于给找出来了,在这里做一下整理,希望对大家有所帮助,对自己也是一个总结,好了,老规矩,上 WinDBG 说话. ...