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可 ...
随机推荐
- Maven将本地项目打包后引入本地另一个项目
进入需要打包的文件夹,执行:mvn clean install -X 生成JAR包 打完JAR包后,将maven依赖安装 执行命令: install:install-file -Dfile=E:\co ...
- 51 eigen、boost等基础库学习
0 引言 eigen库是一个高层次的C++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法.eigen除了C++标准库之外,不需要任何其他的依赖包.Eigen使用的CMake建立配置文件和 ...
- NX二次开发-UFUN创建块UF_MODL_create_block
NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); UF_FEATURE_SIGN Sign = ...
- NXOpenC#_Training_2(cn)【转载】
- 高可用开源方案Heartbeat vs Keepalived
转:http://www.kuqin.com/shuoit/20140623/340745.html 最近因为项目需要,简单的试用了两款高可用开源方案:Keepalived和Heartbeat.两者都 ...
- (转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播
转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RT ...
- LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
题目标签:Binary Search 题目给了我们一组字母,让我们找出比 target 大的最小的那个字母. 利用 binary search,如果mid 比 target 小,或者等于,那么移到右半 ...
- __attribute__ (( __cleanup__))
一.简单说明: cleanup作为__attribute__属性中的一个可选属性值 其作用是当其声明的变量离开了其生命周期,那么 会自动调用你所指定的销毁函数 二.例子: #include <s ...
- Codeforces 1176A Divide it!
题目链接:http://codeforces.com/problemset/problem/1176/A 思路:贪心,对第二个操作进行俩次等于将n变成n/3,第三个操作同理,我们将n不断除以2,再除以 ...
- 用solr DIH 实现mysql 数据定时,增量同步到solr
基础环境: (二)设置增量导入为定时执行的任务: 很多人利用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题. 但 ...