POJ2686 Traveling by Stagecoach(状压DP)
题意:
有一个旅行家计划乘马车旅行。他所在的国家里共有m个城市,在城市之间有若干道路相连。从某个城市沿着某条道路到相邻的城市需要乘坐马车。而乘坐马车需要使用车票,每用一张车票只可以通过一条道路。每张车票上都记有马的匹数,从一个城市移动到另一个城市的所需时间等于城市之间道路的长度除以马的数量的结果。这位旅行家一共有n张车票,第i张车票上马的匹数是ti。一张车票只能使用一次,并且换乘所需要的时间可以忽略。求从城市a到城市b所需要的最短时间。如果无法到达城市b则输出”Impossible”。
分析:
一道经典的状态压缩DP,例如当前状态为“现在在城市V,此时还剩下的车票集合为S".从此状态出发,使用一张在S集合里面的车票i ,就可以转移到城市U".
dp[S][v]含义:旅行家还剩余的马车票组成集合S,并且已到达城市v的时候所花的时间总和。若目前已到达城市v,且马车票组成的集合为S,此时使用集合S中的第i张马车票到达城市u,那么状态转移过程可以表示为:
dp[S&~(1<<i)][u]=min{dp[S&~(1<<i)][u],dp[s][v]+d[s][v]/t[i]};
AC
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = << ;
const int maxm = ;
const int INF = << ; int n, m, p, a, b;
int t[maxm];
int d[maxm][maxm]; //图的邻接矩阵表示(-1表示没有边)
double dp[maxn][maxm];
//dp[S][v] := 到达剩下的车票集合为S并且现在在城市v的状态所需要的最小花费
void so()
{
for (int i = ; i < ( << n); i++)
fill(dp[i], dp[i] + m + , INF); //用足够大的值初始化 dp[( << n) - ][a] = ;
double res = INF;
for (int i = ( << n) - ; i >= ; i--){//枚举票的状态
for (int u = ; u <= m; u++){//起点u
for (int j = ; j < n; j++){//枚举每种票的情况
if (i & ( << j)){//当前票的状态中有第j票
for (int v = ; v <= m; v++){//枚举可以去到的城市
if (d[v][u]){
//使用车票i,从v移动到u
dp[i & ~( << j)][v] = min(dp[i & ~( << j)][v], dp[i][u] + (double)d[u][v] / t[j]);
}
}
}
}
}
}
for (int i = ; i < ( << n); i++)
res = min(res, dp[i][b]);
if (res == INF)
//无法到达
printf("Impossible\n");
else
printf("%.3f\n", res); }
int main( )
{ while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF)
{
if(n==&&m==)
break;
memset(d,,sizeof(d));
for(int i= ; i<n ; i++)
scanf("%d",&t[i]);
while(p--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
d[v][u]=d[u][v]=w;
}
so( );
}
return ;
}
POJ2686 Traveling by Stagecoach(状压DP)的更多相关文章
- POJ 2686 Traveling by Stagecoach (状压DP)
题意:有一个人从某个城市要到另一个城市, 有n个马车票,相邻的两个城市走的话要消耗掉一个马车票.花费的时间呢,是马车票上有个速率值 ,问最后这个人花费的最短时间是多少. 析:和TSP问题差不多,dp[ ...
- Traveling by Stagecoach /// 状压DP oj22914
题目大意: 输入n,m,p,a,b n是车票数(1<=n<=8),m是城市数(2<=m<=30) p是路径数(可能为0),a是起点,b是终点 接下来一行有n个数 为每张车票的马 ...
- POJ 2686 Traveling by Stagecoach 壮压DP
大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...
- POJ2686 Traveling by Stagecoach 状态压缩DP
POJ2686 比较简单的 状态压缩DP 注意DP方程转移时,新的状态必然数值上小于当前状态,故最外层循环为状态从大到小即可. #include <cstdio> #include < ...
- 【状压DP】poj2686 Traveling by Stagecoach
状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可. #include<cstdio> #include< ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- codeforces 21D. Traveling Graph 状压dp
题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...
- poj2686 状压dp入门
状压dp第一题:很多东西没看懂,慢慢来,状压dp主要运用了位运算,二进制处理 集合{0,1,2,3,....,n-1}的子集可以用下面的方法编码成整数 像这样,一些集合运算就可以用如下的方法来操作: ...
- TSP问题之状压dp法
首先,我们先来认识一下什么叫做TSP问题 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
随机推荐
- DevTools in Spring Boot 1.3
Spring Boot 1.3 will ship with a brand new module called spring-boot-devtools. The aim of this modul ...
- C语言获取系统时间
localtime函数 #include <stdio.h> #include <time.h> int main () { time_t t; struct tm *lt; ...
- js中FOR循环的陷阱
//闭包解决 循环输出的问题 for(var i=0;i<rows.length;i++) {( function (i) { })(i);
- Codeforces 1114D Flood Fill (区间DP or 最长公共子序列)
题意:给你n个颜色块,颜色相同并且相邻的颜色块是互相连通的(连通块).你可以改变其中的某个颜色块的颜色,不过每次改变会把它所在的连通块的颜色也改变,问最少需要多少次操作,使得n个颜色块的颜色相同. 例 ...
- 杭电acm 1015题
马上要找工作了,锻炼下自己的写程序能力,不多说,上代码 /********************杭电acm 1015 已AC 在这个程序里,使用穷举法来实现,但是输出顺序需要安装字典的最大 来输出 ...
- noi.ac day1t3 Sort
传送门 分析 快排的原理是以任意一个数为标准,然后把所有小于它的数换到它的左边,所有大于它的数换到它的右边.我们就使用快排的思路,分治整个区间.对于每个区间以排好序的这个数列的中间位置的值为标准,然后 ...
- javascript 基础练习 做Bingo图
---恢复内容开始--- <!DOCTYPE html><html> <head> <meta charset="utf-8&q ...
- 精美3D中国象棋
本人2013年的巅峰之作,现在已经完全免费放送.象棋界面的史诗革命.当前下载版本仅支持Windows 平台. 操作: 方向键的 上,下,左,右 控制棋盘翻转.Home 键回到初始状态,End按键回到平 ...
- 安装visual_Paradigm,时序图的应用
此安装包已经上传到sunny的百度网盘. 删除,即,右击别的地方,然后,选择delete即可. 拖箭头,拖到某个实体上,再松开,会自动连线. 很好的一款画图工具.
- WordCount编码和测试
WordCount编码和测试 项目地址:https://github.com/handsomesnail/WordCount PSP表格 PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟) ...