题意:

裸的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的更多相关文章

  1. POJ 1185 状态压缩DP(转)

    1. 为何状态压缩: 棋盘规模为n*m,且m≤10,如果用一个int表示一行上棋子的状态,足以表示m≤10所要求的范围.故想到用int s[num].至于开多大的数组,可以自己用DFS搜索试试看:也可 ...

  2. POJ 1185 状态压缩DP 炮兵阵地

    题目直达车:   POJ 1185 炮兵阵地 分析: 列( <=10 )的数据比较小, 一般会想到状压DP. Ⅰ.如果一行10全个‘P’,满足题意的状态不超过60种(可手动枚举). Ⅱ.用DFS ...

  3. poj 2923(状态压缩dp)

    题意:就是给了你一些货物的重量,然后给了两辆车一次的载重,让你求出最少的运输次数. 分析:首先要从一辆车入手,搜出所有的一次能够运的所有状态,然后把两辆车的状态进行合并,最后就是解决了,有两种方法: ...

  4. Mondriaan's Dream(POJ 2411状态压缩dp)

    题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放 ...

  5. poj 2411 状态压缩dp

    思路:将每一行看做一个二进制位,那么所有的合法状态为相邻为1的个数一定要为偶数个.这样就可以先把所有的合法状态找到.由于没一层的合法状态都是一样的,那么可以用一个数组保存.由第i-1行到第i行的状态转 ...

  6. poj 3254 状态压缩DP

    思路:把每行的数当做是一个二进制串,0不变,1变或不变,找出所有的合法二进制形式表示的整数,即相邻不同为1,那么第i-1行与第i行的状态转移方程为dp[i][j]+=dp[i-1][k]: 这个方程得 ...

  7. POJ 3254 状态压缩 DP

    B - Corn Fields Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536KB    ...

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

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

  9. poj 3311(状态压缩DP)

    poj  3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...

随机推荐

  1. LeetCode(5) - Longest Palindromic Substring

    这道题要求的是给你一个string, 如“adcdabcdcba",要求返回长度最大的回文子字符串.这里有两个条件,一是子字符串,而是回文.用纯暴力搜索的话,需要用到O(n^3)的时间,必然 ...

  2. mysql create table - data_type length -- clwu

    mysql create table 时,有时需要指定  data_type length http://dev.mysql.com/doc/refman/5.5/en/create-table.ht ...

  3. Xcode升级后插件失效的原理与修复办法

    转载:http://joeshang.github.io/2015/04/10/fix-xcode-upgrade-plugin-invalid/ Xcode 的插件大大丰富了 Xcode 的功能,而 ...

  4. 第三百二十四天 how can I 坚持

    下午去打了会篮球,好累,又把android开发环境搭建起来了,明天把天气应用搞起来. 今天老妈打电话说昨晚梦到我小时候了.. 是啊,都这么大了,不能让他们老操心了. 过两天买根鱼竿去钓鱼. 睡觉.

  5. Latex 横排图片

    \begin{figure} \begin{minipage}[t]{0.5\linewidth} \centering \includegraphics[width=2.2in]{figure/an ...

  6. 转】启动tomcat时 错误: 代理抛出异常 : java.rmi.server.ExportException: Port already in use: 1099的解决办法

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/5288399.html   感谢! 一.问题描述 今天一来公司,在IntelliJ IDEA 中启动Tomcat服务 ...

  7. oracle学习 五 使用存储过程创建一个重置密码为123456的功能(持续更新中)

    首先写一个函数是MD5的方法 create FUNCTION GET_MD5 ( p_str in varchar2) RETURN varchar2 IS BEGIN RETURN Utl_Raw. ...

  8. LRESULT与wParam和lParam的问题

    在微软vc提供的头文件中有定义在winnt.h中typedef long LONG;在windef.h中typedef LONG LRESULT; 所以LRESULT就是long,也就是长整形之所以取 ...

  9. 汇编语言程序入门实验二:在dos下建立子目录操作

    汇编语言程序入门实验二:在dos下建立子目录操作 1,背景 在读此文,并读懂前,建议读者先阅读这两篇博客 1,在dos环境下汇编语言程序设计入门(输出hello world)和masm32的下载.安装 ...

  10. magiczoom 插件去版本(放大镜效果)

    在放大镜效果中代码中有 Please upgrade to full version of Magic Zoom Plus™ 去除办法: 在 magiczoom 去版本 magiczoomplus.j ...