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问题,但是每个点可以 ... 
随机推荐
- Linux 权限相关
			Linux中,所有文件都有 三种权限:User ,Group,Other 三个文件: /etc/passwd :包括所有系统账号,一般用户身份和root信息 /etc/shadow :保存个人密码 / ... 
- Mapreduce读取Hbase表,写数据到多个Hbase表中
			Job端的变化: 通过设置conf,配置输出表,在reduce中获取输出表名字 Configuration conf = job.getConfiguration(); //输出表1 conf.set ... 
- windows下执行build_native.sh报权限问题
			编辑build_native.sh 在前面加上 chmod 777 -R ./* 
- 转】使用log4jdbc记录SQL信息
			原博文出自于: http://www.cnblogs.com/xdp-gacl/p/4081848.html 感谢! 一.log4jdbc的简单介绍 使用log4jdbc在不改变原有代码的情况下,就可 ... 
- Spark生态系统BDAS
			目前,Spark已经发展成为包含众多子项目的大数据计算平台. 伯克利将Spark的整个生态系统称为伯克利数据分析栈(BDAS). 其核心框架是Spark,同时BDAS涵盖支持结构化数据SQL查询与分析 ... 
- MYSQL数据库性能调优之五:解决慢查询--存储引擎与数据类型
			3.数据类型的影响 4.存储引擎的影响 看你的mysql现在已提供什么存储引擎:mysql> show engines; 看你的mysql当前默认的存储引擎:mysql> show var ... 
- Fedora 16设置开机自启动程序与Ubuntu的区别
			Ubuntu设置开机自启动脚本的方法是:修改/etc/init.d/rc.local这个文件,添加需要启动的程序即可,相关函数如下: void SetSysAutoBoot() { ] = {}; ; ... 
- linux 下查找大于100M的文件
			命令行如下 find . -type f -size +100M Linux系统下查找大文件或目录的技巧 当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢?以易读 ... 
- Intellij IDEA 14.x 中的Facets和Artifacts的区别
			Facets和Artifacts的区别: Facets 表示这个module有什么特征,比如 Web,Spring和Hibernate等: Artifact 是maven中的一个概念,表示某个modu ... 
- MyEclipse中无法将SVN检出来的项目部署到tomcat中
			自己遇到的小问题 : 要以web项目方式从svn上倒下来才可以部署到tomcat下检出步骤: myEclipse -->File-->new-->other-->svn--& ... 
