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

这道题就是搜索BFS+状压dp,把所经过的隧道的状态用二进制表示,然后dp就行。bfs求出每两个隧道的最短距离。

 #include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
#define maxn 1000
using namespace std;
const int inf=<<; int n,m;
char g[][];
int gg[][];
struct node
{
int x1,y1,x2,y2;
} p[maxn],st3;
int dis[][];
int dir[][]= {{,},{,-},{,},{-,}};
int dp[<<][];
bool vis[maxn][maxn]; int bfs(int s,int t)
{
queue<node>q;
memset(vis,false,sizeof(vis));
for(int i=; i<n; i++)
{
for(int j=; j<n; j++)
{
dis[i][j]=inf;
}
}
node st;
st.x1=p[s].x2;
st.y1=p[s].y2;
dis[p[s].x2][p[s].y2]=;
vis[p[s].x2][p[s].y2]=true;
q.push(st);
while(!q.empty())
{
node st1=q.front();
q.pop();
if(st1.x1==p[t].x1&&st1.y1==p[t].y1)
{
return dis[p[t].x1][p[t].y1];
}
for(int i=; i<; i++)
{
int xx=st1.x1+dir[i][];
int yy=st1.y1+dir[i][];
if(xx>=&&xx<n&&yy>=&&yy<n&&g[xx][yy]!='#')
{
if(!vis[xx][yy])
{
dis[xx][yy]=dis[st1.x1][st1.y1]+;
st3.x1=xx;
st3.y1=yy;
vis[xx][yy]=true;
q.push(st3);
}
}
}
}
return -;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(g,,sizeof(g));
for(int i=; i<n; i++)
{
scanf("%s",g[i]);
}
for(int i=; i<m; i++)
{
scanf("%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2);
p[i].x1-=;
p[i].y1-=;
p[i].x2-=;
p[i].y2-=;
}
memset(dp,-,sizeof(dp));
for(int i=; i<m; i++)
{
for(int j=; j<m; j++)
{
if(i==j) gg[i][j]=;
else
gg[i][j]=bfs(i,j);
}
}
for(int i=; i<m; i++)
{
dp[<<i][i]=;
}
for(int i=; i<(<<m); i++)
{
for(int j=; j<m; j++)
{
if((i&(<<j))==) continue;
if(dp[i][j]==-) continue;
for(int k=; k<m; k++)
{
if(gg[j][k]==-) continue;
if(i&(<<k)) continue;
if(dp[i|(<<k)][k]==-) dp[i|(<<k)][k]=dp[i][j]+gg[j][k];
else dp[i|(<<k)][k]=min(dp[i|(<<k)][k],dp[i][j]+gg[j][k]);
}
}
}
int ans=inf;
for(int i=; i<m; i++)
{
if(dp[(<<m)-][i]!=-)
ans=min(ans,dp[(<<m)-][i]);
}
if(ans==inf) printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}

hdu 4856 Tunnels的更多相关文章

  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 Tunnels (记忆化搜索)

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

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

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

  5. hdu 4856 Tunnels 状态压缩dp

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

  6. Tunnels HDU - 4856

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

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

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

  8. HDU 4856

    http://acm.hdu.edu.cn/showproblem.php?pid=4856 西安邀请赛的一道题,这道题我们当时在现场最后1h才发现时状态压缩dp,惊险写出 现在回头想发现当时有点呆, ...

  9. ACM - 动态规划专题 题目整理

    CodeForces 429B  Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> ...

随机推荐

  1. Linux2.6内核--VFS层中和进程相关的数据结构

          系统中的每一个进程都有自己的一组打开的文件,像根文件系统,当前工作目录,安装点等.有三个数据结构将 VFS 层和系统的进程紧密的联系在一起,它们分别是: file_struct,fs_st ...

  2. oracle锁表解决方法

    SQL> select session_id from v$locked_object; SESSION_ID----------142 SQL> SELECT sid, serial#, ...

  3. 【服务器运维】Windows Server 2008 R2 下配置证书服务器和HTTPS

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  4. packets

    packets   时间限制(普通/Java):1000MS/10000MS     运行内存限制:65536KByte 总提交: 27            测试通过: 14 描述 A factor ...

  5. iOS_15_通过代码自己定义cell_微博UI

    终于效果图: BeyondTableViewController.h // // BeyondTableViewController.h // 15_代码自己定义cell_weibo // // Cr ...

  6. SAX PULL解析实例

    XML三种解析方式: SAX解析:基于事件驱动,事件机制基于回调函数的,得到节点和节点之间内容时也会回调事件 PULL解析:相同基于事件驱动,仅仅只是回调时是常量 DOM解析:是先把XML文件装入内存 ...

  7. pat 1049. Counting Ones (30)

    看别人的题解懂了一些些    参考<编程之美>P132 页<1 的数目> #include<iostream> #include<stdio.h> us ...

  8. [转] 用source命令执行脚本和用sh执行脚本之间的区别

    from: http://blog.csdn.net/david_xtd/article/details/8012627 问题: 有很多方式可以执行脚本, 1).source test.bsh 2). ...

  9. linux命令chown修改文件所有权

      Changing User Ownership To apply appropriate permissions, the first thing to consider is ownership ...

  10. C#Linq的使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...