传送门:http://poj.org/problem?id=2686

题意:

  一张图有m(m<=100)个点,一个人想从a点乘马车走到b点,他有n(n<=8)张车票,每张车票有一个val为这张车票可以使用的马的数量,马车每到一个地方就要换乘一次,每次换乘会消耗一张车票,消耗当前这条路长度除以车票的val。求走到b点的最短时间。

题解:

  看到题目很容易想到这是一道TSP,但是不同于一般TSP,这道题的点数有点大,于是我们不能通过直接表示走过哪些点求解。

  这个题还有个关键元素那就是票,票的数量小于等于8,所以我们考虑通过票的使用来进行状态转移。

  dp[i][j]表示票的使用为i的状态下最后走到j所需的最小时间。

 1 #include <iostream>
 2 #include <vector>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cstdio>
 6 using namespace std;
 7 const int INF=0x3f3f3f3f;
 8 typedef long long ll;
 9 int n,m,p,a,b,u,v,w,mx,tck[200];
10 double dp[600][105],ans;
11 struct node {
12     int x,y;
13     node(){}
14     node(int c, int d) {x=c;y=d;}
15 };
16 vector<node> g[102];
17 void init() {
18     ans=INF; mx=1<<n;
19     for(int i=0;i<102;++i) g[i].clear();
20     for(int i=0;i<mx;++i) fill(dp[i],dp[i]+m+1,INF);
21     dp[0][a]=0;
22 }
23
24 int main() {
25     //freopen("in.txt", "r", stdin);
26     while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)) {
27         if(!(n|m|p|a|b)) break;
28         init();
29         for(int i=1;i<=n;++i) scanf("%d",&tck[i]);
30         for(int i=1;i<=p;++i) {
31             scanf("%d%d%d",&u,&v,&w);
32             g[v].push_back(node(u,w)); g[u].push_back(node(v,w));
33         }
34         for(int i=0;i<mx;++i) for(int j=1;j<=m;++j) if(dp[i][j]<1e7){
35             for(int pos=0;pos<g[j].size();++pos)for(int k=1;k<=n;++k)if(~i&(1<<k-1)){
36                 node x=g[j][pos];u=i|(1<<k-1);
37                 dp[u][x.x]=min(dp[u][x.x],dp[i][j]+1.0*x.y/tck[k]);
38                 if(x.x==b) ans=min(ans,dp[u][x.x]);
39             }
40         }
41         if(ans>1e7) printf("Impossible\n");
42         else printf("%.5f\n",ans);
43     }
44     return 0;
45 }

View Code

转载于:https://www.cnblogs.com/saltyfishes/p/7388382.html

POJ 2686 Traveling by Stagecoach相关推荐

  1. 【状压DP】poj2686 Traveling by Stagecoach

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

  2. 命令行参数tail c语言,osg学习笔记2, 命令行参数解析器ArgumentParser

    php简单实现socket通信 socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究 ...

  3. POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...

    累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...

  4. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  5. poj 1300 Door man

    一 原题 Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2951   Accepted: 1205 Des ...

  6. [欧拉回路] poj 1300 Door Man

    题目链接: http://poj.org/problem?id=1300 Door Man Time Limit: 1000MS   Memory Limit: 10000K Total Submis ...

  7. POJ 3268 D-Silver Cow Party

    http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  8. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  9. POJ 2528 Mayor's posters(线段树)

    题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...

  10. POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)

    题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...

最新文章

  1. 剑指offer--3题
  2. python3字典详解_python3中字典详解
  3. 帖子删除显示帖子名称?
  4. Windows与Linux共享文件夹互相访问
  5. android四中启动模式
  6. Matlab传递函数的几种生成方式
  7. isc dhcp_ISC的完整形式是什么?
  8. 列表,元组,字典类的常见简单方法
  9. 信息学奥赛C++语言:重组
  10. 第二十三章:准备原材料
  11. 数学建模:评价模型——聚类分析 K-Means python实现
  12. 论文阅读-Rethinking ImageNet Pre-trainging
  13. 变量类型C#面试题详解
  14. 开源库uthash第一弹uthash.h
  15. Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
  16. Excel日期格式转为常规文本格式
  17. 大家好,我叫小K,初来乍到 请多多关照~
  18. Python进行网页自动打卡系统
  19. 教育系统APP(一)
  20. Python:测试代码

热门文章

  1. Java实现单链表翻转
  2. 封装自己的DB类(PHP)
  3. Python3_tuple
  4. 【Go语言】I/O专题
  5. nodejs脚本后台运行
  6. Juniper SRX210恢复密码过程
  7. 十年Java面向对象编程心路——函数与方法的概念区别
  8. 论文阅读笔记——Internet的流量管制(Traffic Policing)
  9. app首次进入的时候,新手操作进行提醒操作
  10. vue项目 报sockjs.js?9be2:1606 GET http://192.168.43.226:8080/sockjs-node/info?t=1584966826465 net::ERR