题意:

裸的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. 【转】What's the difference between simulation and emulation

    摘要:这2个单词 还是用英文解释,比较准确.按我的理解:simulation就是模拟,可以做些改变. emulation是仿真,是按照原来的样子进行部署,不可以改变. Yes, the concept ...

  2. 本人为项目组制定的一份页面优化指南(easyui页面优化方案)

    #本人为项目组制定的一份页面优化指南(easyui页面优化方案) ##背景 这是一篇我之前为项目组制定的页面优化指南,主要是面向表单页面,典型的像[注册用户](https://passport.cnb ...

  3. Problem About Salesforce SOAP API 32.0 In .Net Project

    最近在集成项目项目中遇到一个问题:在用最新版本(API 32.0)Enterprise WSDL在.Net 中做集成时,初始化SforceService 时会初始化类错误.这算是Salesforce ...

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

    回来的倒不晚,算了不想抱怨了. 晚上回来吃过饭,又看了遍<活着>,把一切悲剧都放在一个人身上了,很朴实,好感人. 一天就写了一个借口,也是醉了. 我的天气预报,我的struts.sprin ...

  5. EntityFramwork6连接MySql错误

    EntityFramwork6连接MySql错误 使用EF6连接MySql产生Exception: ProHub.ssdl(2,2) : 错误 0152: MySql.Data.MySqlClient ...

  6. Connecting Physics Bodies

    [Connecting Physics Bodies] The kinds of joints you can create in Sprite Kit. You add or remove join ...

  7. Hibernate入门(2)- 不用配置用注解

    在上一个例子里面,我用的配置文件的方式,这次改成注解. pom.xml 增加了hibernate-commons-annotations和hibernate-annotations <proje ...

  8. manacher算法(转载)

    原网址:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html manacher算法是我在网上无意中找到的,主要是用来求某个字符串的最长回文子串.不过 ...

  9. hdoj 5335 Walk Out

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5335 #include<stdio.h> #include<cstring> ...

  10. F5 负载均衡 相关资源

    F5负载均衡之检查命令的说明http://net.zdnet.com.cn/network_security_zone/2010/0505/1730942.shtml F5培训http://wenku ...