POJ 2686 Traveling by Stagecoach
传送门: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相关推荐
- 【状压DP】poj2686 Traveling by Stagecoach
状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可. #include<cstdio> #include< ...
- 命令行参数tail c语言,osg学习笔记2, 命令行参数解析器ArgumentParser
php简单实现socket通信 socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究 ...
- POJ 2135 Farm Tour amp;amp; HDU 2686 Matrix amp;amp; HDU 3376 Matrix Again 费用流求来回最短路...
累了就要写题解,近期总是被虐到没脾气. 来回最短路问题貌似也能够用DP来搞.只是拿费用流还是非常方便的. 能够转化成求满流为2 的最小花费.一般做法为拆点,对于 i 拆为2*i 和 2*i+1.然后连 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- poj 1300 Door man
一 原题 Door Man Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2951 Accepted: 1205 Des ...
- [欧拉回路] poj 1300 Door Man
题目链接: http://poj.org/problem?id=1300 Door Man Time Limit: 1000MS Memory Limit: 10000K Total Submis ...
- POJ 3268 D-Silver Cow Party
http://poj.org/problem?id=3268 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...
- poj 2559 Largest Rectangle in a Histogram 栈
// poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...
- POJ 2528 Mayor's posters(线段树)
题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...
- POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)
题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...
最新文章
- 剑指offer--3题
- python3字典详解_python3中字典详解
- 帖子删除显示帖子名称?
- Windows与Linux共享文件夹互相访问
- android四中启动模式
- Matlab传递函数的几种生成方式
- isc dhcp_ISC的完整形式是什么?
- 列表,元组,字典类的常见简单方法
- 信息学奥赛C++语言:重组
- 第二十三章:准备原材料
- 数学建模:评价模型——聚类分析 K-Means python实现
- 论文阅读-Rethinking ImageNet Pre-trainging
- 变量类型C#面试题详解
- 开源库uthash第一弹uthash.h
- Android Timer和TimerTask解决IllegalStateException:Task already scheduled or cancelled
- Excel日期格式转为常规文本格式
- 大家好,我叫小K,初来乍到 请多多关照~
- Python进行网页自动打卡系统
- 教育系统APP(一)
- Python:测试代码
热门文章
- Java实现单链表翻转
- 封装自己的DB类(PHP)
- Python3_tuple
- 【Go语言】I/O专题
- nodejs脚本后台运行
- Juniper SRX210恢复密码过程
- 十年Java面向对象编程心路——函数与方法的概念区别
- 论文阅读笔记——Internet的流量管制(Traffic Policing)
- app首次进入的时候,新手操作进行提醒操作
- vue项目 报sockjs.js?9be2:1606 GET http://192.168.43.226:8080/sockjs-node/info?t=1584966826465 net::ERR