Traveling by Stagecoach /// 状压DP oj22914
题目大意:
输入n,m,p,a,b
n是车票数(1<=n<=8),m是城市数(2<=m<=30)
p是路径数(可能为0),a是起点,b是终点
接下来一行有n个数 为每张车票的马匹数
接下来p行有u,v,w为城市u到城市v路径长度为w
时间计算为 路径长度/车票马匹数
求a到b的最短用时,不可能则输出 Impossible
最后一行以5个0结束
3 4 3 1 4
3 1 2
1 2 10
2 3 30
3 4 20
2 4 4 2 1
3 1
2 3 3
1 3 3
4 1 2
4 2 5
2 4 3 4 1
5 5
1 2 10
2 3 10
3 4 10
1 2 0 1 2
1
8 5 10 1 5
2 7 1 8 4 5 6 3
1 2 5
2 3 4
3 4 7
4 5 3
1 3 25
2 4 23
3 5 22
1 4 45
2 5 51
1 5 99
0 0 0 0 0
30.000
3.667
Impossible
Impossible
2.856
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define N 8
using namespace std;
int n,m,p,a,b;
int t[N],G[][];
double dp[<<N][];
void solve()
{
int st=(<<n)-; /// 注意 1<<n 需要打括号 -比<<优先级高
for(int i=0;i<=st;i++) /// double型 不能用memset初始化
fill(dp[i],dp[i]+m,INF); dp[st][a-]=; // 初始状态 车票都在且位于a点 1为还没用 0为已用
double ans=INF;
for(int p=st;p>=;p--){ // 枚举所有车票状态
ans=min(ans,dp[p][b-]); // 更新到达b点的最少时间
for(int i=;i<m;i++) { // 枚举所在点
if(dp[p][i]==INF) continue;
/// 若车票状态为p且位于i点的dp值为INF
/// 说明当前还未能更新出该情况 则忽略
for(int k=;k<n;k++) // 枚举接下来要使用的车票
if((<<k)&p) { /// 若车票状态p中 还没用过k车票
for(int j=;j<m;j++) { // 枚举使用k车票要去的点
if(G[i+][j+]==INF) continue; // 没有路则忽略
double tmp=(double)G[i+][j+]/t[k]; /// 该路使用k车票需要的时间
dp[p&~(<<k)][j]=min(dp[p&~(<<k)][j],dp[p][i]+tmp);
/// 通过p状态位于j点花费tmp dp[p][i]+tmp
/// 延伸到k车票已用位于i点的状态 dp[p&~(1<<k)][j]
}
}
}
}
// for(int s=0;s<=(1<<n)-1;s++) {
// for(int i=1;i<=m;i++)
// if(dp[s][i]==INF) printf("-1 ");
// else printf("%.3f ",dp[s][i]);
// printf("\n");
// }
if(ans==INF) printf("Impossible\n");
else printf("%.3f\n",ans);
}
int main()
{
while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)) {
for(int i=;i<n;i++) scanf("%d",&t[i]);
if(n+m+p+a+b==) break;
if(p== || n==) { // 没有路或没有车票
printf("Impossible\n");
continue;
}
if(a==b) { // 起点终点为同一点
printf("0\n");
continue;
}
memset(G,INF,sizeof(G));
while(p--) {
int u,v,w; scanf("%d%d%d",&u,&v,&w);
G[u][v]=G[v][u]=min(G[u][v],w);
}
solve();
} return ;
}
Traveling by Stagecoach /// 状压DP oj22914的更多相关文章
- POJ 2686 Traveling by Stagecoach (状压DP)
题意:有一个人从某个城市要到另一个城市, 有n个马车票,相邻的两个城市走的话要消耗掉一个马车票.花费的时间呢,是马车票上有个速率值 ,问最后这个人花费的最短时间是多少. 析:和TSP问题差不多,dp[ ...
- POJ 2686 Traveling by Stagecoach 壮压DP
大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...
- 【状压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. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...
- 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][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- 图片转换为base64
明天中秋了,先祝大家中秋快乐!哈哈,最近见有人在群里问怎么把图片转换成base64格式,之前刚好写过就把代码贴出来. 主要用到canvas中的toDataURL方法 <!DOCTYPE html ...
- vue中使用router全局守卫实现页面拦截
一.背景 在vue项目中使用vue-router做页面跳转时,路由的方式有两种,一种是静态路由,另一种是动态路由.而要实现对路由的控制需要使用vuex和router全局守卫进行判断拦截(安全问题文章最 ...
- hdu多校第八场 1011 (hdu6667) Roundgod and Milk Tea 二分图匹配
题意: 有若干个班,每个班有些人要喝奶茶,也提供一些奶茶,一人喝一杯,但是自己班的人不能喝自己班的奶茶,求最多能有多少人喝上奶茶. 题解: 典型的二分图匹配问题,学生在左,奶茶在右,学生和非自己班的奶 ...
- Beaglebone Black的引脚分配
转自:http://blog.csdn.net/daxueba/article/details/50998000 Beaglebone Black的引脚分配 绝大多数的微型开发平台都提供了一些称为GP ...
- Spring AOP之注解实现
在自定义个注解之后,通过这个注解,标注需要切入的方法,同时把需要的参数传到切面去.那么我们怎么在切面使用这个注解.我们使用这个自定义注解一方面是为了传一些参数,另一方面也是为了省事.具体怎么省事,看我 ...
- 2014 0416 word清楚项目黑点 输入矩阵 普通继承和虚继承 函数指针实现多态 强弱类型语言
1.word 如何清除项目黑点 选中文字区域,选择开始->样式->全部清除 2.公式编辑器输入矩阵 先输入方括号,接着选择格式->中间对齐,然后点下面红色框里的东西,组后输入数据 ...
- python包下载路径
python所有包.模块镜像站 https://www.lfd.uci.edu/~gohlke/pythonlibs/
- json对象数组的创建、遍历、添加、删除、修改、js的splice()用法
本文链接:https://blog.csdn.net/houfengfei668/article/details/79843625 )第二种方式:手动构造json对象数组 )for )用splice方 ...
- idea引入项目下所有文件(ps:包括静态文件夹)
打开项目的目录结构 点击finish 最后删除目录下多余的src就可以了
- [NOIP2005] 过河【Dp,思维题,缩点】
Online Judge:Luogu P1052 Label:Dp,思维题,缩点,数学 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子 ...