主题连接:



id=3311">http://poj.org/problem?id=3311

题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解

思路:用二进制数来表示訪问过的城市集合。f[{S}][j]=已经訪问过的城市集合为S,訪问了j个城市。所需的最少花费。

这里提一下二进制数表示集合的方法(这里最好还是设集合中最多有n个元素):

假设集合S中最多会出现n个元素,则用长度为n的二进制数来表示集合S,每一位代表一个元素。该位为0表示该元素在集合S中不存在,为1表示该元素在集合S中存在

位数 4 3 2 1

S     1 0 1 1

这个集合S里有元素1、2、4

以下是二进制数表示几种集合运算的方法

1、集合S的全集U=(1<<n)-1

2、检查集合S中是否含元素i   S&(1<<(i-1))   (返回0表示不存在。返回1表示存在)

3、从集合S中去除元素i S^(1<<(i-1))

以下是本题的思路:

首先对整个图跑一次Floyd多源最短路。得到两两点之间的最短距离,然后用DP求解,f[{S}][j]=已经訪问过的城市集合为S。訪问了j个城市,所需的最少花费。

f[S][i]=min{f[S-{j}][j]+dist[j][i]}

最后得到的答案ans=min(f[全集][i]+dist[i][0])

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm> #define MAXN 15
#define MAXM 1<<15
#define INF 0x3f3f3f3f using namespace std; int f[MAXM][MAXN]; //f[{S}][j]=已经訪问过的城市集合为S。訪问了j个城市,所需的最少花费
int dist[MAXN][MAXN]; //点与点之间的距离
int n; int min(int a,int b)
{
if(a<b) return a;
return b;
} void Floyd()
{
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
} int TSP() //DP求TSP
{
memset(f,0x7f,sizeof(f));
for(int s=0;s<(1<<n);s++) //枚举訪问城市集合S,全集为(1<<n)-1
for(int i=1;i<=n;i++) //枚举近期訪问过的城市i
if(s&(1<<(i-1))) //city(i)∈S
{
if(s==(1<<(i-1))) //{city(i)}==S
f[s][i]=dist[0][i];
else
{
for(int j=1;j<=n;j++) //枚举上一次訪问的城市j
if((s&(1<<(j-1)))&&i!=j) //城市j不和i同样
f[s][i]=min(f[s][i],f[s^(1<<(i-1))][j]+dist[j][i]); //Cs {city(J)}=s^(1<<(i-1))
}
}
int ans=INF;
for(int i=1;i<=n;i++)
ans=min(ans,f[(1<<n)-1][i]+dist[i][0]);
return ans;
} int main()
{
while(scanf("%d",&n)&&n)
{
memset(dist,0,sizeof(dist));
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
scanf("%d",&dist[i][j]);
Floyd();
printf("%d\n",TSP());
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

[POJ 3311]Hie with the Pie——谈论TSP难题DP解决方法的更多相关文章

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

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

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

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

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

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

  4. POJ 3311 Hie with the Pie floyd+状压DP

    链接:http://poj.org/problem?id=3311 题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多 ...

  5. POJ 3311 Hie with the Pie(Floyd+状态压缩DP)

    题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...

  6. poj 3311 Hie with the Pie(状态压缩dp)

    Description The Pizazz Pizzeria prides itself or more (up to ) orders to be processed before he star ...

  7. POJ 3311 Hie with the Pie (状压DP)

    题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...

  8. POJ 3311 Hie with the Pie 【状压DP】

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

  9. poj 3311 Hie with the Pie

    floyd,旅游问题每个点都要到,可重复,最后回来,dp http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Me ...

随机推荐

  1. Java代码检查工具

    FindBugs:不注重样式和格式,重视真正的缺陷和潜在的性能问题,,基于Bug Patterns,在不运行的情况下检查字节码代码质量. Jalopy:Java源代码格式化工具,可自定义规则. PMD ...

  2. poj 3225 间隙(横截面和填充操作)

    http://poj.org/problem?id=3225 一道题又做了一天. .这道题对我来说起初有N多难点. 1:区间的开闭怎样解决. . 2:如何把区间的交并补.对称差转化为对线段树的操作. ...

  3. 使用bootbox.js(二级务必提交书面和数字到数字中国)

    页面文件 <#-- 页头 --> <#assign currNav = "deposit"> <#assign title="网校充值&qu ...

  4. 文章之间的基本总结:Activity生命周期

    孔子:温故而知新.它可以作为一个教师.<论语> 同样的学习技巧.对于技术文件或书籍的经典技术,期待再次看到它完全掌握,这基本上是不可能的,所以,我们常常回来几次,然后仔细研究,为了理解作者 ...

  5. 作为一个新人,如何学习嵌入式Linux?

    作为一个新人.如何学习嵌入式Linux?我一直在问太多次,特写文章来回答这个问题. 在学习嵌入式Linux之前.肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会).C语言要 ...

  6. 使用Bootstrap 他写道网站

    新发现vdceye有些难看的网站,为了找到一个bootstrap工具,我一次又一次地写信给网站 这个工具是很容易使用 http://vdceye.com/ 版权声明:本文博客原创文章,博客,未经同意, ...

  7. MongoDB日常保养

    它引入了程序来进行维护管理工具 MongoDB的日常维护包含使用配置文件,设置訪问控制.Shell交互,系统监控和管理,数据库日常备份和恢复 启动和停止MongoDB 启动后能够通过数据库的IP加po ...

  8. 采用curl库

    Windows通过使用curl库: 到http://curl.haxx.se/下了个curl的源代码下来,源代码是用VC6编译的,我在VS2005下又一次进行编译.竟然仅仅有一个警告. cUrl的实现 ...

  9. 复制(5)——事务复制中的发布者(Publisher)

    发布者是所有被复制(replicated)的数据的集合.每个发布者可以有多个发布(publication),每个发布项包含多个项目(articles),但是这些发布必须处于一个单一的数据库中,而每个项 ...

  10. File类基本操作之OutputStream字节输出流

    贴代码了,已经測试,可正常编译 package org.mark.streamRW; import java.io.File; import java.io.FileOutputStream; imp ...