poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311
题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短。最后输出最短距离即可。注意:每一个地方可重复访问多次。
经典的状压dp,因为每次送外卖不超过10个地方,可以压缩。
由于题中明确说了两个城市间的直接可达路径(即不经过其它城市结点)不一定是最短路径,所以需要借助floyd首先求出任意两个城市间的最短距离。
然后,在此基础上来求出遍历各个城市后回到出发点的最短路径的距离,即求解TSP问题。
代码:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- #define ll long long
- const int maxn=1e5+;
- const int INF=0x3f3f3f3f;
- int dp[<<][];
- int d[][];
- int n;
- void floyd() ///多源最短路,任意两点之间的距离都是最短的
- {
- for(int k=; k<=n; k++)
- for(int i=; i<=n; i++)
- for(int j=; j<=n; j++)
- d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
- }
- ///dp[i][j]表示已经走过的城市为i,当前所在的城市为j的最短路程。
- ///相应的状态转移方程为dp[i][j]=min(dp[i^(1<<j)][k]+d[k][j]);
- ///i^(1<<j)的意思是将j这个城市从i状态中去掉。 d[k][j] 是k和j之间的距离。
- void DP()
- {
- for(int i=; i<(<<n); i++)
- for(int j=; j<=n; j++)
- {
- int tmp=<<(j-);
- if(tmp==i) dp[i][j]=d[][j];
- else if(tmp&i)
- {
- dp[i][j]=INF;
- for(int k=; k<=n; k++)
- if(k!=j && (i&(<<(k-))))
- dp[i][j]=min(dp[i][j],dp[i^tmp][k]+d[k][j]);
- }
- }
- int x=(<<n)-;
- int ans=INF;
- for(int i=; i<=n; i++)
- ans=min(ans,dp[x][i]+d[i][]);
- printf("%d\n",ans);
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- while(scanf("%d",&n)== && n)
- {
- for(int i=; i<=n; i++)
- for(int j=; j<=n; j++)
- scanf("%d",&d[i][j]);
- floyd();
- DP();
- }
- return ;
- }
poj3311 TSP经典状压dp(Traveling Saleman Problem)的更多相关文章
- DAG求最短路--TSP变形--状压dp
DAG状压dp的一种 题目: $m$个城市,$n$张车票,第i张车票上的时间是$t_i$, 求从$a$到$b$的最短时间,如果无法到达则输出“impossible” 解法: 考虑状态:“现在在城市$v ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- POJ2288 Islands and Bridges(TSP:状压DP)
求一个图的哈密顿路径的最大权及其路径数.显然状态压缩+DP. dp[v][u][S] 表示从v走到当前顶点 u且走过的顶点集合是S的 最大权值和方案数 这题我用记忆化搜索,从终点开始递归进行,感觉这样 ...
- POJ 1185 经典状压dp
做了很久的题 有注释 #include<stdio.h> #include<string.h> #include<algorithm> #include<ma ...
- HDU 1074 Doing Homework(经典状压dp)
题目链接 Doing Homework Ignatius has just come back school from the 30th ACM/ICPC. Now he has a ...
- poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185 参考博客:http://poj.org/problem?id=1185 大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化 ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
- 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 ...
随机推荐
- sqlserver事务加锁机制
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏 ...
- [转]Oracle10g数据库自动诊断监视工具(ADDM)使用指南
第一章 ADDM简介 在Oracle9i及之前,DBA们已经拥有了很多很好用的性能分析工具,比如,tkprof.sql_trace.statspack.set even ...
- Android之Linearlayouy线性布局
写了个小例子xml代码如下: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout x ...
- empty和isset函数详解
1.empty函数 用途:检测变量是否为空 若变量不存在则返回 TRUE 若变量存在且其值为"".0."0".NULL..FALSE.array().var $ ...
- Spring MVC返回Map格式JSON数据
问题描述: ajax中走error : function(e) {} 问题背景: 在测试controller层时,试过了ResponseEntity<ResponseModel>这种类型返 ...
- C#夯实基础之多线程三:线程的优先级
一.为什么需要优先级--线程调度的问题 在现实生活中,优先级是一个很常见的现象:在火车站,如果你是孕妇,你是可以走进站中的专门绿色通道的,可以提前上火车以免拥挤:火警119匪警110出警的时候,都是人 ...
- 《转载》Spring MVC之@RequestBody, @ResponseBody 详解
引言: 接上一篇文章讲述处理@RequestMapping的方法参数绑定之后,详细介绍下@RequestBody.@ResponseBody的具体用法和使用时机: 简介: @RequestBody 作 ...
- webbrower判断页面是否加载完成的好方法
public void WaitPageCompleted(int timeOutSec) { ; ; j < timeOutSec * ; j++) { _wb.Invoke(new Acti ...
- DevExpress 创建EXCEL
添加库引用:DevExpress.Data.v13.1.dll. DevExpress.Docs.v13.1.dll.DevExpress.Office.v13.1.Core.dll. DevExpr ...
- 【安装Redis】CentOS7 下安装NodeJs+Express+MongoDB+Redis
Redis,V3.2,官网l官方链接:http://www.redis.io/download,参考:http://blog.csdn.net/mlks_2008/article/details/19 ...