[poj3311]Hie with the Pie(Floyd+状态压缩DP)
题意:tsp问题,经过图中所有的点并回到原点的最短距离。
解题关键:floyd+状态压缩dp,注意floyd时k必须在最外层
转移方程:$dp[S][i] = \min (dp[S \wedge (1 < < (i - 1))][k] + dis[k][j],dp[S][i])$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define inf 100000000
using namespace std;
int dis[][];
int dp[<<][];
int n,ans;
int main(){
while(scanf("%d",&n)&&n){
for(int i=;i<=n;i++)for(int j=;j<=n;j++)scanf("%d",&dis[i][j]);
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=min(dis[i][k]+dis[k][j],dis[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];
else{
dp[S][i]=inf;
for(int j=;j<=n;j++){
if(S&(<<(j-))&&i!=j)//枚举不是城市I的其他城市
dp[S][i]=min(dp[S^(<<(i-))][j]+dis[j][i],dp[S][i]);
}
}
}
}
int ans=inf;
for(int i=;i<=n;i++){
ans=min(ans,dp[(<<n)-][i]+dis[i][]);
}
printf("%d\n",ans);
}
return ;
}
改进了一下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define inf 100000000
using namespace std;
int dis[][];
int dp[<<][];
int n,ans;
int main(){
while(scanf("%d",&n)&&n){
for(int i=;i<=n;i++)for(int j=;j<=n;j++)scanf("%d",&dis[i][j]);
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=min(dis[i][k]+dis[k][j],dis[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];
else{
dp[S][i]=inf;
for(int j=;j<=n;j++){
if(S&(<<j)&&i!=j)//枚举不是城市I的其他城市
dp[S][i]=min(dp[S^(<<i)][j]+dis[j][i],dp[S][i]);
}
}
}
printf("%d\n",dp[(<<(n+))-][]);
}
return ;
}
[poj3311]Hie with the Pie(Floyd+状态压缩DP)的更多相关文章
- POJ 3311 Hie with the Pie(Floyd+状态压缩DP)
题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...
- poj 3311 Hie with the Pie(状态压缩dp)
Description The Pizazz Pizzeria prides itself or more (up to ) orders to be processed before he star ...
- POJ3311 Hie with the Pie 【状压dp/TSP问题】
题目链接:http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total ...
- POJ 3311 Hie with the Pie floyd+状压DP
链接:http://poj.org/problem?id=3311 题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多 ...
- HDU 5418 Victor and World (Floyd + 状态压缩DP)
题目大意:从起点 1 开始走遍所有的点,回到起点 1 ,求出所走的最短长度. 思路:首先利用 Floyed 求出任意两点之间的最短距离 dis[i][j].求出任意两点之间的最短距离后,运用动态规划. ...
- TZOJ 1937 Hie with the Pie(floyd+状压dp)
描述 The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfo ...
- POJ3311 Hie with the Pie(状压DP,Tsp)
本题是经典的Tsp问题的变形,Tsp问题就是要求从起点出发经过每个节点一次再回到起点的距离最小值,本题的区别就是可以经过一个节点不止一次,那么先预处理出任意两点之间的最短距离就行了,因为再多走只会浪费 ...
- poj 3311(floyd+状态压缩)
题目链接:http://poj.org/problem?id=3311 思路:Floyd + 状态压缩DP 题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且 ...
- POJ 3311 Hie with the Pie(状压DP + Floyd)
题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...
随机推荐
- butterknif
// butterknife public class ButterknifeActivity extends Activity { @butterknife.Bind(R.id.tv_title) ...
- IOS NSDate 调整当前时间戳为明天
这个可以根据需要调整 在day month hour minute second 等都行 以下是以当前时间戳为基础,调整时间为明天的零点零时零分零秒 可以根据需要 写成毫秒的 +(NSStri ...
- Sqoop架构以及应用介绍
本篇文章在具体介绍Sqoop之前,先给大家用一个流程图介绍Hadoop业务的开发流程以及Sqoop在业务当中的实际地位. 如上图所示:在实际的业务当中,我们首先对原始数据集通过MapReduce进行 ...
- CSS3自定义下拉框菜单
在线演示 本地下载
- parseInt、parseFloat、Number、Boolean、valueOf总结
parseInt(string, radix) 功能: 将字符串转换为十进制的数字 radix: string的进制,没有时根据string进行判断: 1~9开头 十进制 0x开头 16进制 0开头 ...
- while & do-while
while的形式——while(条件表达式){循环体:} 当满足条件表达式时,执行循环体,之后继续验证是否满足条件表达式,满足继续执行循环体,之后重复,直到不满足条件表达式,循环结束. 先判断, ...
- 高通8X16电池BMS算法(二)【转】
本文转载自:http://www.voidcn.com/blog/yanleizhouqing/article/p-6051912.html 上一篇主要讲电池相关的一些知识,上节忘记讲了,电池一般分为 ...
- Linux电源管理(5)_Hibernate和Sleep功能介绍【转】
本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...
- 开发rsync启动脚本2
使用函数更加规范的开发rsync启动脚本 #!/bin/bash #chkconfig: #description: create by vincen . /etc/init.d/functions ...
- <轻量算法>根据核密度估计检测波峰算法 ---基于有限状态自动机和递归实现
原创博客,转载请联系博主! 希望我思考问题的思路,也可以给大家一些启发或者反思! 问题背景: 现在我们的手上有一组没有明确规律,但是分布有明显聚簇现象的样本点,如下图所示: 图中数据集是显然是个3维的 ...