POJ3311 Hie with the Pie(状压DP,Tsp)
本题是经典的Tsp问题的变形,Tsp问题就是要求从起点出发经过每个节点一次再回到起点的距离最小值,本题的区别就是可以经过一个节点不止一次,那么先预处理出任意两点之间的最短距离就行了,因为再多走只会浪费更多的距离。
dp[S][u]表示当前已访问的节点集合为S,从u出发走完剩余节点回到起点的最短距离。
边界条件:dp[(1<<n)-1][0]=0,最后的答案就是dp[0][0];
记忆化递归代码:
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 #define M 15
6 #define INF 0x3f3f3f3f
7 int n;
8 int g[M][M];
9 int dp[1<<11][M];
10
11 void init(){
12 memset(dp,-1,sizeof(dp));
13 memset(g,0x3f,sizeof(g));
14 }
15
16 void floyd(){
17 for(int k=0;k<n;k++)
18 for(int i=0;i<n;i++)
19 for(int j=0;j<n;j++)
20 g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
21 }
22
23 int Tsp(int S,int u){//经典Tsp问题模板
24 if(dp[S][u]>=0) return dp[S][u];//返回记忆的结果
25 if(S==(1<<n)-1&&u==0) return dp[S][u]=0;//递归边界
26 int ans=INF;
27 for(int v=0;v<n;v++)
28 if(!(S>>v&1)&&g[u][v]!=INF)
29 ans=min(ans,Tsp(S|1<<v,v)+g[u][v]);//用未访问的v节点更新
30 return dp[S][u]=ans;
31 }
32
33 int main(){
34 while(~scanf("%d",&n),n){
35 n++;
36 init();
37 for(int i=0;i<n;i++)
38 for(int j=0;j<n;j++)
39 scanf("%d",&g[i][j]);
40 floyd();//预处理
41 printf("%d\n",Tsp(0,0));
42 }
43 return 0;
44 }
POJ3311 Hie with the Pie(状压DP,Tsp)的更多相关文章
- 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
题解网上一搜一大坨的,不用复述了吧. 只是觉得网上dp方程没多大问题,但是状态的表示含义模糊.不同于正常哈密顿路径求解,状态表示应当改一下. 首先定义一次移动为从一个点经过若干个点到达另一个点,则$f ...
- POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推 ...
- East Central North America 2006 Hie with the Pie /// 状压dp oj22470
题目大意: 输入n,有n个地方(1~n)需要送pizza pizza点为0点 接下来n+1行每行n+1个值 表示 i 到 j 的路径长度 输出从0点到各点送pizza最后回到0点的最短路(点可重复走) ...
- POJ3311 Hie with the Pie 【状压dp/TSP问题】
题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total ...
- Hie with the Pie(POJ3311+floyd+状压dp+TSP问题dp解法)
题目链接:http://poj.org/problem?id=3311 题目: 题意:n个城市,每两个城市间都存在距离,问你恰好经过所有城市一遍,最后回到起点(0)的最短距离. 思路:我们首先用flo ...
- poj3311 Hie with the Pie (状态压缩dp,旅行商)
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3160 Accepted: 1613 ...
- zoj 3471 Most Powerful(状压dp+Tsp问题+连续性问题)
上来直接一波敲键盘,直接套Tsp问题的代码 然后WA 发现貌似这道题没有连续性. Tsp问题是一条路径,一个点到另一个点,多了一个限制,所以就需要加多一维 而这道题没有限制,也就是说那一维不需要加,我 ...
- poj 2288 Islands and Bridges (状压dp+Tsp问题)
这道题千辛万苦啊! 这道题要涉及到当前点和前面两个点,那就设dp[state][i][j]为当前状态为state,当前点为i,前一个点为j 这个状态表示和之前做炮兵那题很像,就是涉及到三个点时,就多设 ...
- light oj 1057 状压dp TSP
#include <iostream> #include <cstdlib> #include <cstring> #include <queue> # ...
- 【POJ3311】Hie with the Pie(状压DP,最短路)
题意: 思路:状压DP入门题 #include<cstdio> #include<cstdlib> #include<algorithm> #include< ...
随机推荐
- nginx+redis+tomcat session绑定
需求: 公司后端两台tomcat做负载,前端nginx接收用户请求:为了使无论用户请求到后端哪台设备其session都能保持一致,需要做session绑定:所需软件: tomcat8.redis.ng ...
- typescript中的esModuleInterop选项
当没有加esModuleInterop时 库的代码: export const a = 1; export default function b() {} 生成代码 exports.__esModul ...
- Java8新特性: CompletableFuture详解
CompletableFuture实现了CompletionStage接口和Future接口,前者是对后者的一个扩展,增加了异步回调.流式处理.多个Future组合处理的能力,使Java在处理多任务的 ...
- Luogu1868 饥饿的奶牛 (动态规划)
开始以为是贪心,10分:想了个DP估计会超时,一翻题解各路初中神仙,背包都有. \(n^2\)很好想,考虑单调性用二分优化出log #include <iostream> #include ...
- JDK数组阻塞队列源码深入剖析
JDK数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...
- Lua环境搭建编译[Lua5.2+VS2010]
这里是我编译的和一个测试Demo:http://download.csdn.net/detail/allh45601/6783653 大家如果看我下边说的不是很清楚,可以下载这个具体工程: 群:103 ...
- RabbitMQ 入门系列:5、基础编码:交换机的进阶介绍及编码方式。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- 【lwip】06-网络接口层分析
目录 前言 6.1 概念引入 6.2 网络接口层数据概念流图 6.3 网卡收包程序流图 6.4 网卡数据结构 6.4.1 struct netif源码 6.4.2 字段分析 6.4.2.1 网卡链表 ...
- 新零售SaaS架构:商品系统架构设计
SaaS产品就像一座冰山,冰山以上的部分是功能.数据(可见部分).用户界面,冰山以下是系统架构.完整的数据模型.开放体系.非功能性需求(扩展性.可维护性.性能.安全等). 短期内想要快速上线产品,可能 ...
- KingbaseES 转义字符
在SQL标准中字符串是用单引号括起来的,在KingbaseES中遵守了该标准,如果在字符串中需要使用到单引号,就需要对其进行转义. 方式一:使用E和反斜杠进行转义 方式二:直接用一个单引号来转义 在K ...