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. Facebook 内部高效工作PPT

    Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去.没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下26张PPT的分享将为您带来时间价值管理的技巧. ...

  2. Spring学习(一)——Spring中的依赖注入简介【转】

      [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring. ...

  3. sqlserver获取表名,字段名

    一.获取表的基本信息 SELECT [TableName] = [Tables].name , [TableOwner] = [Schemas].name , [TableCreateDate] = ...

  4. [转]CentOS更改yum源与更新系统

    [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...

  5. php include

    get_include_path  获取当前 include_path 配置选项的值,在当前代码目录未找到include文件时,则到include_path去include. set_include_ ...

  6. 判断comboBox是否选对了绑定的数据库中的项

    实现: comboBox1下拉列表已绑定数据库,将选中的项保存到数据库时,判断是否已选中下拉列表里的项 如果没选中,或者输入了其他的值,和已绑定的数据不匹配,出现提示框 按钮的点击事件中: strin ...

  7. SQL Server 索引介绍

    数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力 详细出处参考:http://www.jb51.net/article/30950.ht ...

  8. HDU 5313 bitset优化背包

    题目大意: 添加尽可能少的边,最后使图形成二分图 一开始将图区分成一个个联通分量,根据二分图染色,计算出每个联通分量的黑色点和白色点的个数 希望添加的边最少,那么合并的时候,希望黑白块尽可能平均,这无 ...

  9. URAL 1519 基础插头DP

    题目大意: 给定一个图,一部分点'*'作为障碍物,求经过所有非障碍点的汉密尔顿回路有多少条 基础的插头DP题目,对于陈丹琦的论文来说我觉得http://blog.sina.com.cn/s/blog_ ...

  10. CSU 1111 D(Contest #3)

              有三户人家共拥有一座花园,每户人家的太太均需帮忙整理花园.A 太太工作了5 天,B 太太则工作了4 天,才将花园整理完毕.C 太太因为正身怀六甲无法加入她们的行列,便出了90元.请 ...