http://acm.hdu.edu.cn/showproblem.php?pid=4856

西安邀请赛的一道题,这道题我们当时在现场最后1h才发现时状态压缩dp,惊险写出

现在回头想发现当时有点呆,这种明显tsp模型的题目当时鬼迷心窍去写搜索,超时而不知悔改,实际是水题一道

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std ;
const int INF=0xfffffff ;
int n,m ; char M[][] ;
int vis[][] ;
int dis[][] ;
int dx[]={,-,,} ;
int dy[]={,,,-} ;
int dp[][<<] ;//在管道i时,状态为s struct node
{
int x1,y1,x2,y2 ;
}kk[] ;
struct point
{
int x,y,step ;
} ;
int bfs(node a,node b)
{
memset(vis,,sizeof(vis)) ;
queue <point> q ;
point s ;
s.x=a.x2 ;s.y=a.y2 ;s.step= ;
vis[s.x][s.y]= ;
q.push(s) ;
while(!q.empty())
{
point u=q.front() ;
q.pop() ;
if(u.x==b.x1 && u.y==b.y1)
{
return u.step ;
}
for(int i= ;i< ;i++)
{
int xx=u.x+dx[i] ;
int yy=u.y+dy[i] ;
if(xx< || xx>=n || yy< || yy>=n)continue ;
if(M[xx][yy]=='#')continue ;
if(vis[xx][yy])continue ;
vis[xx][yy]= ;
point next ;
next.x=xx ;next.y=yy ;next.step=u.step+ ;
q.push(next) ;
}
}
return INF ;
}
void INIT()
{
for(int i= ;i< ;i++)
for(int j= ;j< ;j++)
dis[i][j]=INF ;
for(int i= ;i<m ;i++)
{
for(int j= ;j<m ;j++)
{
if(i==j)
{
dis[i][j]= ;
continue ;
}
dis[i][j]=bfs(kk[i],kk[j]) ;
}
}
} int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i= ;i<n ;i++)
scanf("%s",M[i]) ;
for(int i= ;i<m ;i++)
{
scanf("%d%d%d%d",&kk[i].x1,&kk[i].y1,&kk[i].x2,&kk[i].y2) ;
kk[i].x1-- ;kk[i].y1-- ;kk[i].x2-- ;kk[i].y2-- ;
}
INIT() ;
for(int i= ;i< ;i++)
for(int j= ;j<(<<) ;j++)
dp[i][j]=INF ;
for(int i= ;i<m ;i++)dp[i][<<i]= ;
int ans=INF ;
for(int i= ;i<(<<m) ;i++)
{
for(int j= ;j<m ;j++)
{
if(i&(<<j))
{
for(int k= ;k<m ;k++)
{
if(dis[k][j]==INF || !(i&(<<k)))continue ;
dp[j][i]=min(dp[j][i],dp[k][i^(<<j)]+dis[k][j]) ;
}
}
}
}
for(int i= ;i<m ;i++)
ans=min(ans,dp[i][(<<m)-]) ;
if(ans==INF)puts("-1") ;
else printf("%d\n",ans) ;
}
return ;
}

HDU 4856的更多相关文章

  1. hdu 4856 Tunnels(bfs+状态压缩)

    题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...

  2. HDU 4856 Tunnels(BFS+状压DP)

    HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...

  3. HDU 4856 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...

  4. hdu 4856 Tunnels

    http://acm.hdu.edu.cn/showproblem.php?pid=4856 这道题就是搜索BFS+状压dp,把所经过的隧道的状态用二进制表示,然后dp就行.bfs求出每两个隧道的最短 ...

  5. hdu 4856 Tunnels (记忆化搜索)

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. hdu 4856 Tunnels (bfs + 状压dp)

    题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...

  7. hdu 4856 Tunnels 状态压缩dp

    Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  8. Tunnels HDU - 4856

    BFS寻找每个点到其他点的最小距离 再状压DP,DP[i][j] i二进制表示每个点的到达状态,j为当前所在点 #include<iostream> #include<cstring ...

  9. 状压dpHDU - 4856

    J - Tunnels HDU - 4856 题目大意:地图上有些管道,在管道行走里不需要花费时间,但从一个管道的出口走到另一个管道的入口则需要花费时间,问走完所有管道最短的时间,如果不行,则输出-1 ...

随机推荐

  1. Java 集合系列 08 Map架构

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  2. Greenplum——升级的分布式PostgresSQL

    Greenplum数据库基于PostgreSQL开源技术.本质上讲,它是多个PostgreSQL实例一起充当一个数据库管理系统.Greenplum以PostgreSQL 8.2.15为基础构建,在SQ ...

  3. php安装出现的部分错误

    在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: checking for BZip2 support… yes ch ...

  4. CentOS hadoop配置错误Incorrect configuration: namenode address dfs.namenode.servicerpc-address ...

    # ./sbin/start-all.sh                     This script is Deprecated. Instead use start-dfs.sh and st ...

  5. ssh localhost “Permission denied (publickey)

    再次遇到 SSH Server And "Permission denied (publickey) 用这个关键词搜索才找到howtogeek上答案: sshd : Authenticati ...

  6. sql类型转换

    CAST 和 CONVERT 将某种数据类型的表达式显式转换为另一种数据类型.CAST 和 CONVERT 提供相似的功能. 语法 使用 CAST: CAST ( expression AS data ...

  7. treap codevs 4543普通平衡树

    #include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...

  8. ROS程序编辑器

    我找到的比较好用的ROS代码编辑器,对于emacs和vim等神级编辑器不能自动补全,对于我这种新手编译出错都是字母打错了, 因此果断回避,找到了一款叫做code blocks的编辑器,在软件中心就能下 ...

  9. centos=>gsutil,iptables

    sudo apt-get remove --purge gsutil sudo easy_install -U pip  sudo pip2 install gsutil gsutil ls gs:/ ...

  10. LTP学习

    下载LTP源码和模型文件: https://github.com/linux-test-project/ltp 官方说明文档 http://ltp.readthedocs.org/zh_CN/late ...