poj 3311 tsp入门
题意: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入门的更多相关文章
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
- Hie with the Pie POJ - 3311
Hie with the Pie POJ - 3311 The Pizazz Pizzeria prides itself in delivering pizzas to its customers ...
- Hie with the Pie (POJ 3311) 旅行商问题
昨天想练习一下状态压缩,百度搜索看到有博客讨论POJ 3311,一看就是简单的旅行商问题,于是快速上手写了状态压缩,死活样例都没过... 画图模拟一遍原来多个城市可以重复走,然后就放弃思考了... 刚 ...
- [POJ 3311]Hie with the Pie——谈论TSP难题DP解决方法
主题连接: id=3311">http://poj.org/problem?id=3311 题目大意:有n+1个点,给出点0~n的每两个点之间的距离,求这个图上TSP问题的最小解 ...
- POJ 3311 Hie with the Pie:TSP(旅行商)【节点可多次经过】
题目链接:http://poj.org/problem?id=3311 题意: 你在0号点(pizza店),要往1到n号节点送pizza. 每个节点可以重复经过. 给你一个(n+1)*(n+1)的邻接 ...
- poj 3311 Hie with the Pie (状压dp) (Tsp问题)
这道题就是Tsp问题,稍微加了些改变 注意以下问题 (1)每个点可以经过多次,这里就可以用弗洛伊德初始化最短距离 (2)在循环中集合可以用S表示更清晰一些 (3)第一维为状态,第二维为在哪个点,不要写 ...
- 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 ...
- poj 3311 Hie with the Pie (TSP问题)
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4491 Accepted: 2376 ...
- POJ 3311 Hie with the Pie(状压DP + Floyd)
题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...
随机推荐
- JavaScript实现级联下拉框
<!DOCTYPE html> <html> <head> <meta name="author" content="Yeeku ...
- R 分类进行数值处理
主要Mark一下R程序中,分类进行数值计算的情况. 1.aggregate函数 有数据框case,列名分别a,b,c,d,e,f (1)根据一列对另一列求和:根据a,对d求和 sum1 <- a ...
- C#泛型委托,匿名方法,匿名类
class Test { delegate K proxy<T, K>(T t, K k); //泛型委托,注意返回值的写法,返回值的类型K先于其声明proxy<T,K>中的K ...
- WPF打印原理,自定义打印
一.基础知识 1.System.Printing命名空间 我们可以先看一下System.Printing命名空间,东西其实很多,功能也非常强大,可以说能够控制打印的每一个细节,曾经对PrintDial ...
- 34 Sources for Test Ideas
We recommend collecting test ideas continuously from a variety of information sources. Consider the ...
- memset的使用
今天写程序的时候用了memset这个函数,我知道他是关于清空指针的,设置为0.但我用的时候,没有注意到他是以字节为单位进行操作的,改了半天其他程序内容.要注意的是,memset是对字字进行操作,所以以 ...
- Anaconda安装更新库
平台:win64+anaconda 1. 如何查看已安装的库 打开 Anaconda Command Prompt ,在命令提示符窗口中输入以下命令: pip list # 或者 conda list ...
- Java server数据之(4):Redis鸟瞰
Redis简介 Redis是NoSQL数据库中的一种,属于key-value键值对这一个子类别. 它常被称作是一款数据结构服务器(data structure server). Redis中的数据结构 ...
- ORCHARD中文文档(翻译)
众所周知,Orchard是.net领域最好的开源CMS之一,他使用了微软最先进的技术,有一群先进理念的支持者,但是,所有的事情在国内总得加个但是,Orchard也不例外,中文资料相对比较少,官网提供的 ...
- #Linux学习笔记# Linux文件的属性以及权限说明
1. Linux文件的属性 关于Linux文件的属性的说明和设置请参考鸟哥Linux私房菜:Linux 的文件权限与目录配置 2. 目录和文件的权限意义 在Linux系统中,每个文件都有三种身份的权限 ...