题意:n+1个点:0--n,找一条路径从0点出发遍历1--n的点再回到0,每个点可经过不止一次,求最短路径

裸的TSP问题,先用Floyd求出各个点之间最短路,再状压dp即可

用n+1位二进制表示状态

附模板:

 //首先不难想到用FLOYD先求出任意2点的距离dis[i][j]
//接着枚举所有状态,用11位二进制表示10个城市和pizza店,1表示经过,0表示没有经过
//定义状态DP(S,i)表示在S状态下,到达城市I的最优值
//接着状态转移方程:DP(S,i) = min{DP(S^(1<<i-1),k) + dis[k][j],DP(S,i)},器重S^(1<<i-1)表示未到达城市i的所有状态,1<=k<=n
//对于全1的状态,即S = (1<<n)-1则表示经过所有城市的状态,最终还需要回到PIZZA店0
//那么最终答案就是min{DP(S,i) + dis[i][0]}
//dij[i][j]:i到j最短路 for(int S = ;S <= (<<n)-;++S)//枚举所有状态,用位运算表示
for(int i = ;i <= n;++i)
{
if(S & (<<(i-)))//状态S中已经过城市i
{
if(S == (<<(i-))) dp[S][i] = dis[][i];//状态S只经过城市I,最优解自然是从0出发到i的dis,这也是DP的边界
else//如果S有经过多个城市
{
dp[S][i] = INF;
for(int j = ;j <= n;++j)
{
if(S & (<<(j-)) && j != i)//枚举不是城市I的其他城市
dp[S][i] = min(dp[S^(<<(i-))][j] + dis[j][i],dp[S][i]);
//在没经过城市I的状态中,寻找合适的中间点J使得距离更短,和FLOYD一样
}
}
}
}
ans = dp[(<<n)-][] + dis[][];
for(int i = ;i <= n;++i)
if(dp[(<<n)-][i] + dis[i][] < ans)
ans = dp[(<<n)-][i] + dis[i][];
printf("%d/n",ans);

Code:

 #include <iostream>
#include <cstring>
using namespace std;
#define INF 1<<28;
#define maxn 15 int a[maxn][maxn];
int dp[<<maxn][maxn];
int ans,S,n; int main()
{
ios::sync_with_stdio(false);
while (cin>>n)
{
memset(a,,sizeof(a));
if (n==) break;
else
{
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
cin>>a[i][j]; for (int k=;k<=n;k++)
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
if (a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[i][k]+a[k][j];
} for (int S=;S<=(<<n)-;S++)
for (int i=;i<=n;i++)
{
if (S&(<<(i-)))
{
if (S==(<<(i-))) dp[S][i]=a[][i];
else
{
dp[S][i]=INF;
for (int j=;j<=n;j++)
{
if (S&(<<(j-))&&(j!=i))
dp[S][i]=min(dp[S^(<<(i-))][j] + a[j][i],dp[S][i]);
}
}
}
} ans = dp[(<<n)-][] + a[][];
for(int i = ;i <= n;i++)
if(dp[(<<n)-][i] + a[i][] < ans)
ans = dp[(<<n)-][i] + a[i][]; cout<<ans<<endl;
}
} return ;
}

reference:

http://blog.csdn.net/chinaczy/article/details/5890768

poj 3311 tsp入门的更多相关文章

  1. poj 3311(状态压缩DP)

    poj  3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...

  2. Hie with the Pie POJ - 3311

    Hie with the Pie POJ - 3311 The Pizazz Pizzeria prides itself in delivering pizzas to its customers ...

  3. Hie with the Pie (POJ 3311) 旅行商问题

    昨天想练习一下状态压缩,百度搜索看到有博客讨论POJ 3311,一看就是简单的旅行商问题,于是快速上手写了状态压缩,死活样例都没过... 画图模拟一遍原来多个城市可以重复走,然后就放弃思考了... 刚 ...

  4. [POJ 3311]Hie with the Pie——谈论TSP难题DP解决方法

    主题连接:  id=3311">http://poj.org/problem?id=3311 题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解 ...

  5. POJ 3311 Hie with the Pie:TSP(旅行商)【节点可多次经过】

    题目链接:http://poj.org/problem?id=3311 题意: 你在0号点(pizza店),要往1到n号节点送pizza. 每个节点可以重复经过. 给你一个(n+1)*(n+1)的邻接 ...

  6. poj 3311 Hie with the Pie (状压dp) (Tsp问题)

    这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...

  7. POJ 3311 Hie with the Pie 兼 Codevs 2800 送外卖(动态规划->TSP问题)

    Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possi ...

  8. poj 3311 Hie with the Pie (TSP问题)

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4491   Accepted: 2376 ...

  9. POJ 3311 Hie with the Pie(状压DP + Floyd)

    题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...

随机推荐

  1. FlashInspector 【Firefox浏览器插件,flash分析工具】

    Inspect flash(swf)'s DisplayObject with mouse. Overview the swf's DisplayObject list. Set the inspec ...

  2. java 21 - 14 Properties类

    类 Properties Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串. 注意:Properties是Has ...

  3. nginx的学习材料

    1. 章亦春 关于nginx的讲解 http://agentzh.org/misc/slides/nginx-conf-scripting/nginx-conf-scripting.html#2 2. ...

  4. SQL 第一范式、第二范式、第三范式、BCNF

    作者 : Dolphin 原文地址: http://blog.csdn.net/qingdujun/article/details/27365979 一.第一范式 1NF 要求:每一个分量必须是不可分 ...

  5. CSS3弹性伸缩布局(二)——flex布局

    上一篇博客<CSS3弹性伸缩布局(一)——box布局>介绍了旧版本的box布局,而这篇博客将主要介绍最新版本的flex布局的基础知识. 新版本简介 新版本的Flexbox模型是2012年9 ...

  6. hammer.js中文文档

    转自:http://www.uedsc.com/hammerjs-api.html HammerJS是一个优秀的.轻量级的触屏设备手势库,现在已经更新到2.04版本,跟1.0版本有点天壤地别了,毕竟改 ...

  7. C语言 百炼成钢10

    //题目28:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第 //3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后 //问第一个人 ...

  8. Linux下的MySQL简单操作(服务启动与关闭、启动与关闭、查看版本)

    小弟今天记录一下在Linux系统下面的MySQL的简单使用,如下: 服务启动与关闭 启动与关闭 查看版本 环境 Linux版本:centeros 6.6(下面演示),Ubuntu 12.04(参见文章 ...

  9. 浪潮之巅——IT那点事之二—蓝色巨人IBM

    蓝色巨人IBM的全称是国际商用机器公司(International Business Machines Corporation),纵观IBM的发展历史,可以看出IBM与机器结缘,以商用为主的发展策略. ...

  10. c# r3 inline hook

    前言 老婆喜欢在QQ游戏玩拖拉机,且安装了一个记牌器小软件,打开的时候弹出几个IE页面加载很多广告,于是叫我去掉广告.想想可以用OD进行nop填充,也可以写api hook替换shellexecute ...