题目大意:

输入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结束

Sample Input

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

Sample Output

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的更多相关文章

  1. POJ 2686 Traveling by Stagecoach (状压DP)

    题意:有一个人从某个城市要到另一个城市, 有n个马车票,相邻的两个城市走的话要消耗掉一个马车票.花费的时间呢,是马车票上有个速率值 ,问最后这个人花费的最短时间是多少. 析:和TSP问题差不多,dp[ ...

  2. POJ 2686 Traveling by Stagecoach 壮压DP

    大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...

  3. 【状压DP】poj2686 Traveling by Stagecoach

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

  4. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  5. codeforces 21D. Traveling Graph 状压dp

    题目链接 题目大意: 给一个无向图, n个点m条边, 每条边有权值, 问你从1出发, 每条边至少走一次, 最终回到点1. 所走的距离最短是多少. 如果这个图是一个欧拉回路, 即所有点的度数为偶数. 那 ...

  6. TSP问题之状压dp法

    首先,我们先来认识一下什么叫做TSP问题 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人 ...

  7. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  8. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  9. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

随机推荐

  1. delphi 文件存取方法与文件管理组件

    9.2  文件存取方法与文件管理组件 9.2.1  存取文件的类方法 Delphi在许多需要与文件打交道的类中定义了文件存取方法,使用这些方法可以非常方便地将类中的数据保存到文件中,或从文件中读取所需 ...

  2. PHP headers_list() 函数

    定义和用法 headers_list() 函数返回已发送的(或待发送的)响应头部的一个列表. 该函数返回包含报头的数组. 语法 headers_list() 提示和注释 提示:如需确定是否已发送报头, ...

  3. Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存

    首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...

  4. 虚拟IP---Linux下一个网卡配置多个IP

    转:http://blog.csdn.net/turkeyzhou/article/details/16971225 Linux下配置网卡ip别名何谓ip别名?用windows的话说,就是为一个网卡配 ...

  5. POJ2226-Muddy Fields-二分图*

    目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门  原题目描述在最下面.  一个nm的矩阵,有坑有草,可以用1x长度的木板盖住坑,但不能盖到草. ...

  6. Linux ifconfig 单网卡配置多网段

      1 2 3 4 5 6 7 8 9 10 11 ifconfig eth0 down ifconfig eth0 hw ether 01:02:03:04:05:06 ifconfig eth0  ...

  7. Instrumentation 实践详解

    原文地址:https://blog.csdn.net/pengjunlee/article/details/72717622

  8. Putty 两步代理访问互联网

    工作在机房,有时需要访问外网. 此时浏览器需要使用代理服务器,访问的流程如下: 由于SERVER2不能直接访问互联网,而SERVER3可以(机房无法直接访问SERVER3)所以需要两步代理. 配置流程 ...

  9. windows中无法访问共享问题

    http://jingyan.baidu.com/article/456c463b66d9320a5831448b.html 很多情况下我们遇到我们设置的共享没有密码别人无法访问,为此为大家推荐几步操 ...

  10. jquery操作html元素之( 获得内容和属性)

    * jQuery - 获得内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变 ...