题意:

一共有m个城市,城市之间有双向路连接,一个人有n张马车票,一张马车票只能走一条路,走一条路的时间为这条路的长度除以使用的马车票上规定的马车数,问这个人从a出发到b最少使用时间。

分析:

状态压缩dp,用dp[i][j]表示到达j城市的最小时间,其中i为剩余车票的集合。集合i使用状态压缩的表示方法。由于剩余车票的集合不断变小,实际上为求DAG最短路问题。

代码:

#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
using namespace std;
int n, m, p, a, b;
const int maxn =1<<10, maxm = 35, INF = 0x3fffffff;
double dp[maxn][maxm];
int dist[maxm][maxm], t[maxm];
int main (void)
{
while(~scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)&&n+m+p+a+b!=0){
for(int i = 0; i < n; i++) scanf("%d",&t[i]);
int x, y, z;
memset(dist,-1,sizeof(dist));
for(int i = 0; i < 1<< n; i++){
fill(dp[i]+1, dp[i] + m+1, INF);
}
dp[(1<<n)-1][a] = 0;
for(int i = 0; i < p; i++){
scanf("%d%d%d",&x,&y,&z);
dist[x][y] = z;
dist[y][x] = z;
} for(int s = (1<<n) - 2; s >=0; s--){
res = min(res, dp[s][b]);
for(int j = 1; j <= m; j++ ){
for(int i = 0; i < n; i++){
if(!(s&1<<i)){
for(int k = 1; k <= m; k++){
if(dist[k][j]>=0){
dp[s][j] = min(dp[s][j], dp[s|(1<<i)][k] + (double)dist[k][j]/t[i]);
}
}
}
}
}
}
double res = INF;
for(int s = (1<<n) - 1; s >=0; s--)
if(res==INF) printf("Impossible\n");
else printf("%.6f\n",res);
}
return 0;
}

最新文章

  1. Linux下Tomcat启动正常,但浏览器无法访问
  2. webapi之jsonp调用
  3. Android JSON 解析库的使用 - Gson 和 fast-json
  4. 【C#编程基础学习笔记】4---Convert类型转换
  5. Visual Studio中的lib的链接顺序
  6. hdu2141AC代码分享
  7. bzoj 2427: [HAOI2010]软件安装
  8. dedecms织梦首页如何调用文章列表?
  9. 【django之stark组件】
  10. BZOJ_3261_最大异或和_可持久化trie
  11. windows创建域共享文件
  12. sql server 备份与恢复系列一 必备知识
  13. Drying [POJ3104] [二分答案]
  14. JAVA 设计模式遵循的六大基本准则
  15. Maven编译时跳过Test
  16. 19. Fight over Fox-hunting 猎狐引发的冲突
  17. iOS动画相关(持续更新)
  18. NFC低功耗模式
  19. [小北De编程手记] : Lesson 02 - Selenium For C# 之 核心对象
  20. Struts2文件上传带进度条,虽然不是很完美

热门文章

  1. redis 远程连接方法
  2. 绿化VSCode
  3. C++ 多态、虚函数、虚析构函数
  4. 物联网初学者智能家居必备迅为iTOP-4412开发板
  5. COMMENT - 定义或者改变一个对象的评注
  6. 在DOS行下设置静态IP
  7. sysbench下载安装
  8. HTML5小時鐘
  9. CAD交互绘制圆弧(com接口)
  10. _bbox_pred函数