poj 2688 状态压缩dp解tsp
题意:
裸的tsp。
分析:
用bfs求出随意两点之间的距离后能够暴搜也能够用next_permutation水,但效率肯定不如状压dp。dp[s][u]表示从0出发訪问过s集合中的点。眼下在点u走过的最短路程。
代码:
//poj 2688
//sep9
#include <iostream>
#include <queue>
using namespace std;
const int maxW=32;
const int maxN=12;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
char graph[maxW][maxW];
int g[maxW][maxW];
int vis[maxW][maxW];
int d[maxN][maxN];
int n,w,h;
int dp[1<<maxN][maxN]; struct Node{
int x,y;
}dirty_pnt[maxN]; void bfs(int s)
{
memset(vis,-1,sizeof(vis));
queue<Node> Q;
Q.push(dirty_pnt[s]);
vis[dirty_pnt[s].x][dirty_pnt[s].y]=0;
while(!Q.empty()){
Node q=Q.front();Q.pop();
int x=q.x,y=q.y;
for(int i=0;i<4;++i){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<h&&ny>=0&&ny<w&&g[nx][ny]>=0&&vis[nx][ny]==-1){
vis[nx][ny]=vis[x][y]+1;
Node p;
p.x=nx,p.y=ny;
Q.push(p);
}
}
}
} int rec(int s,int u){
if(dp[s][u]!=-1)
return dp[s][u];
int i,j,res=INT_MAX;
int ss=s&(~(1<<u));
for(i=0;i<n;++i)
if(ss>>i&1)
res=min(res,rec(ss,i)+d[i+1][u+1]);
return dp[s][u]=res;
}
int main()
{
int i,j,k;
while(scanf("%d%d",&w,&h)==2&&(w+h)){
for(i=0;i<h;++i)
scanf("%s",graph[i]);
n=0;
for(i=0;i<h;++i)
for(j=0;j<w;++j){
if(graph[i][j]=='*'){
g[i][j]=++n;
dirty_pnt[n].x=i;
dirty_pnt[n].y=j;
}
else if(graph[i][j]=='.')
g[i][j]=0;
else if(graph[i][j]=='o'){
g[i][j]=0;
dirty_pnt[0].x=i;
dirty_pnt[0].y=j;
}else
g[i][j]=-1;
}
int not_reach=0;
for(k=0;k<=n&&!not_reach;++k){
bfs(k);
for(i=0;i<=k;++i){
d[k][i]=d[i][k]=vis[dirty_pnt[i].x][dirty_pnt[i].y];
if(d[k][i]==-1){
not_reach=1;
break;
}
}
}
// for(i=0;i<=n;++i)
// for(j=0;j<=n;++j){
// printf("%d %d==%d\n",i,j,d[i][j]);
// }
if(not_reach==1){
printf("-1\n");
continue;
}
memset(dp,-1,sizeof(dp));
int ans=INT_MAX;
for(i=0;i<n;++i)
dp[1<<i][i]=d[0][i+1];
for(i=0;i<n;++i)
ans=min(ans,rec((1<<n)-1,i));
printf("%d\n",ans);
}
return 0;
}
poj 2688 状态压缩dp解tsp的更多相关文章
- POJ 1185 状态压缩DP(转)
1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...
- POJ 1185 状态压缩DP 炮兵阵地
题目直达车: POJ 1185 炮兵阵地 分析: 列( <=10 )的数据比较小, 一般会想到状压DP. Ⅰ.如果一行10全个‘P’,满足题意的状态不超过60种(可手动枚举). Ⅱ.用DFS ...
- poj 2923(状态压缩dp)
题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...
- Mondriaan's Dream(POJ 2411状态压缩dp)
题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...
- poj 2411 状态压缩dp
思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个.这样就可以先把所有的合法状态找到.由于没一层的合法状态都是一样的,那么可以用一个数组保存.由第i-1行到第i行的状态转 ...
- poj 3254 状态压缩DP
思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k]: 这个方程得 ...
- POJ 3254 状态压缩 DP
B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS Memory Limit:65536KB ...
- POJ 3311 Hie with the Pie(Floyd+状态压缩DP)
题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
随机推荐
- Exploit用法示例
一.msf> show exploits与msf> show payloads:这两条命令用于展示Metaploit目录中所有可用的漏洞利用代码和攻击载荷. 二.msf> searc ...
- JavaScript高级程序设计(第三版)第五章 引用类型
5.2 Array类型 var colors = new Array(3); //创建一个包含3项的数组 var names = new Array("Greg"); //创建一个 ...
- 第三次阅读赵炯博士的《linux内核代码完全注释》:序
这是我第三次阅读linux内核代码完全注释了,当然前两次也没有读完,第一次读到第五章,第二次第七章. 所以说,赵炯博士对我最大的帮助时介绍了intel386的结构,以及内核编程的方法. 至于真正的内核 ...
- 徐汉彬:亿级Web系统搭建——单机到分布式集群(转载)
文章转载自http://www.csdn.net/article/2014-11-06/2822529/1 当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的 ...
- poj 2196 Specialized Four-Digit Numbers
如果一个数字 十进制的各位数的和 == 十六进制的各位数的和 == 十二进制的各位数的和,则输出,从2992到9999 #include <cstdio> int toDD(int n) ...
- Ajax禁止缓存的几个解决方案
最常用的方法是 方法1:服务器端代码加入 代码如下 复制代码 response.setHeader("Cache-Control", "no-cache, must-r ...
- ResultMap
Mybatis 数据库字段和对象属性的映射 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ...
- Liunx更新源
不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp /etc/apt/sources.l ...
- python用httplib模块发送get和post请求
在python中,模拟http客户端发送get和post请求,主要用httplib模块的功能. 1.python发送GET请求 我在本地建立一个测试环境,test.php的内容就是输出一句话: 1 e ...
- 【百题留念】hdoj 1524 A Chess Game(dfs + SG函数应用)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1524 #include<stdio.h> #include<cstring> ...