POJ 3311 Hie with the Pie

题目大意

一个披萨店要请司机来送披萨,这家店最多接受10个订单,由于预算的问题,只能雇佣一名司机,要求用最短的时间,从披萨店出发送完最后再回到披萨店(途中可能不止一次经过一个地方)。

输入

测试数据可能有多个,第一行包含一个整数 n n n ( 1 ≤ n ≤ 10 1 \leq n \leq 10 1≤n≤10),接下来的 n + 1 n+1 n+1行,每行包含 n + 1 n+1 n+1个整数,披萨点的位置 0 0 0以及后面 n n n个位置,其中第 i i i行第 j j j个值表示从位置 i i i到达位置 j j j所用的时间(其中对于从 i i i到 j j j可能有更快捷的方式,数据不是对称的),当 n = 0 n=0 n=0时,表示输入结束

输出

对于每一个测试用例输出一个整数,表示所花费的最短的时间

样例输入

3
0 1 10 10
1 0 1 2
10 1 0 10
10 2 10 0
0

样例输出

8

分析

由于每两个地点的直接距离不一定是最短的,因此首先要用 f l o y d floyd floyd算法来更新所有点之间的最短距离

然后这个问题就变成了典型的 T S P TSP TSP问题,为了便捷的表示已经被访问过的位置,可以使用二进制来进行压缩,例如有 4 4 4个位置,分别是 0 , 1 , 2 , 3 0,1,2,3 0,1,2,3,其中 1 1 1和 2 2 2已经被访问过,那么二进制表示为 ( 0110 ) 2 (0110)_2 (0110)2​,被访问过的顶点就用 1 1 1表示,没访问过的用 0 0 0表示。这样就可以将状态压缩到一个数组中去。就可以清楚的表示哪些顶点被访问过,哪些没有被访问。

其中 d [ s ] [ j ] d[s][j] d[s][j]表示,在当前的 s s s的状态下(已经访问过的点),正处在 j j j的位置上回到顶点所花费的最小时间。状态转移方程如下

d [ s ∣ 1 &lt; &lt; k ] [ k ] = m i n ( d [ s ∣ 1 &lt; &lt; k ] [ k ] , &ThinSpace;&ThinSpace; d [ s ] [ j ] + a [ j ] [ k ] ) d[s|1&lt;&lt;k][k] = min(d[s|1&lt;&lt;k][k],\,\,d[s][j]+a[j][k]) d[s∣1<<k][k]=min(d[s∣1<<k][k],d[s][j]+a[j][k])

其中点 k k k表示下次要访问的点,是从已经访问过的点 j j j转移到下一个点 k k k。更新完数组后

最终答案就是,枚举所有的 d [ ( 1 &lt; &lt; n ) − 1 ] [ i ] + a [ i ] [ 0 ] &ThinSpace;&ThinSpace;&ThinSpace;&ThinSpace;&ThinSpace;&ThinSpace; ( 0 &lt; i &lt; n ) d[(1 &lt;&lt; n) - 1][i] + a[i][0]\,\,\,\,\,\,(0&lt;i&lt;n) d[(1<<n)−1][i]+a[i][0](0<i<n),其中最小值就是答案。这句话的意思就是,访问所有顶点后,可能停留再任意一个地方 i i i,因此要枚举每一个地方回到 0 0 0的时间。

代码

#include <cstdio>
#include <cstring>
#define N 11
#define INF 0x3f3f3f3f
#define min(a,b) a>b?b:aint a[N][N];
int d[1 << N][N];
int n;inline void floyd() {for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)for(int k = 0; k < n; k++)a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
}int main () {while(1) {scanf("%d", &n);if(!n) break;n++;memset(d, INF, sizeof(d)); //初始化d[1][0] = 0; //从0出发,二进制中1表示第一个位置访问过,所以置为0for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)scanf("%d", &a[i][j]);floyd();for(int s = 0; s < 1 << n; s++)for(int j = 0; j < n; j++)if(s >> j & 1) //找到已经访问过的点jfor(int k = 0; k < n; k++)if(!(s >> k & 1)) //找到没有被访问过的点kd[s|1 << k][k] = min(d[s|1 << k][k], d[s][j] + a[j][k]); //从j点更新到k点int ans = INF;for(int i = 1; i < n; i++)ans = min(ans, d[(1 << n)-1][i] + a[i][0]);printf("%d\n", ans);}return 0;
}

Hie with the Pie(Floyd 状压DP)相关推荐

  1. 【POJ 3311】Hie with the Pie(状压DP)

    Hie with the Pie 题目链接:POJ 3311 题目大意 给你 n+1 个点,其中 0 号点是特殊点. 然后两个点之间都有路径可以走. 然后你要从特殊点出发走过所有点回到特殊点,问你最短 ...

  2. bzoj3055 礼物运送(Floyd+状压dp)

    先Floyd预处理出两点间最短路径,然后状压dp,dp[s][i]表示状态为s的点都遍历了,停在i的最小时间.枚举一个j去转移就好了.然后处理出f[s],表示遍历了s状态的点的最小花费.然后枚举A遍历 ...

  3. Hie with the Pie(Floyd+状压dp)

    描述 传送门:poj-3311  The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as ...

  4. POJ - 3311- Hie with the Pie ( 状压dp )

    题目链接:点击进入 题目 题意 从 0 出发经过所有点最后再回到 0 点的最短距离( 可以多次经过同一个点 ) 思路 dp [ i ] [ j ] 代表经过状态 i 里的点最后到 j 点经过的距离 首 ...

  5. hdu 5418 Victor and World (floyd+状压dp)

    题目大意:可重复访问顶点的TSP问题. 解法:点击打开链接 坑点:n=1 #include<iostream> #include<cstdio> #include<cst ...

  6. 百练4124:海贼王之伟大航路(状压DP)

    题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms  内存限制: 65536kB 描述 " ...

  7. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  8. 【LDU】 Week2自测 Disney‘s FastPass | 状压dp、Floyd

    这题是hdu 4114... 跟着19的打了打周测,发现个好题 写了写还wa了一发 题目大意: 给出n个点,k个要旅游的景点,然后给出k个景点的信息(位置,t,ft,门票所在地点),t于ft表示,如果 ...

  9. 动态规划 —— 状压 DP

    [概述] 通常将以一个集合内的元素信息作为状态且状态总数为指数级别的动态规划称为状态压缩动态规划. 其是一类以集合信息为状态的特殊的动态规划问题,主要有传统集合动态规划与基于连通性状态压缩的动态规划两 ...

最新文章

  1. dw读取access中的图片_怎样从Access数据库中读取图片?解决办法
  2. UI基础篇-iOS中简单图片浏览器的实现
  3. 学院后勤报修系统php_后勤不后|愿你的深情不再是秘密
  4. 【原创】推荐广告入门:DeepCTR-Torch,基于深度学习的CTR预测算法库
  5. python批量处理txt_浅谈Python批处理文件夹中的txt文件
  6. mybatis开启字段自动映射为java驼峰命名规则
  7. 分享10个创新的扁平风格的简历页面设计
  8. k8s部署jenkins
  9. CAD看图软件中如何将CAD图纸由天正T20版本转换为T3版本?
  10. 大地测量学基础 | 时间系统
  11. python进行谱曲_人工智能可以作曲吗?
  12. ip地址与交换机工作原理
  13. Java消息盒子实现性能,Python高级进阶#007 pyqt5消息盒子QMessageBox
  14. 即拼商城系统模式开发
  15. 人人都说的SaaS,你真的了解它吗?
  16. jnz和djnz_8051的指令
  17. Chicken first or egg?
  18. 输入框上的Magnifier
  19. 微信小程序长按图片发送给好友
  20. 基于at89c51单片机的led数字倒计时器设计c语言,at89c51单片机led数字倒计时器课程设计论文-本科毕业设计.doc...

热门文章

  1. 加贺电子发表手掌大小的小型轻量DLP放映机
  2. js 中编码(encode)和解码(decode)的三种方法(传递是特殊符号丢失问题,如‘+’)
  3. ACL流量控制工具-- 王贝的学习笔记
  4. 手把手教你用JAVA实现“声音复刻”功能(复刻你的声音)标贝科技
  5. 地图作业平台低代码实战(搭建能力提升)
  6. java语言学术报告厅,文理学院举办java编程语言公开课
  7. POSCMS 邮件服务器配置
  8. 今天你够“敏捷”吗?
  9. 苹果手机充电口接触不良怎么办_苹果连充电口都要干掉?
  10. VUE+ECHARTS结合使用制作一个图标页面