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. Flume源码-LoggerSink

    package org.apache.flume.sink; import com.google.common.base.Strings; import org.apache.flume.Channe ...

  2. node.js环境配置(angularjs高级程序设计中出现的错误)

    一:npm install connect会出现错误:解决方法 1:$ npm install connect@2.X.X 2:$ npm install serve-static: 建立server ...

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

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

  4. Lucene和jackson冲突

    今天在使用lucene的时候,想直接在Controller中返回json对象,于是在Spring中配置了JackSon的converter: <bean id="jacksonMess ...

  5. JMeter在里面Json数据处理方法

    http://eclipsesource.com/blogs/2014/06/12/parsing-json-responses-with-jmeter/ Json作为一种数据交换格式在网络开发.特别 ...

  6. JavaScript arguments类数组

    1. 什么是类数组 arguments 是一个类数组对象.代表传给一个function的参数列表.  我们来传一个实例. function printArgs() { console.log(argu ...

  7. linux elinks命令

    Elinks是基于文本的免费浏览器,用于Unix及基于Unix的系统.Elinks支持 HTTP,HTTP Cookies以及支持浏览Perl和Ruby脚本.也很好的支持选项卡浏览.最棒的是它支持鼠标 ...

  8. Linux UDP严重丢包问题的解决

    测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...

  9. AS 自动生成选择器 SelectorChapek

    简介 https://github.com/inmite/android-selector-chapek 设计师给我们提供好了各种资源,每个按钮都要写一个selector是不是很麻烦? 这么这个插件就 ...

  10. 外网访问自己的tomcat

    我们平常学习时经常会写一下javaweb程序,我们为了更能逼近现实,就想着自己的javaweb程序发布后,外网的同学能够访问我们的网站,难道我们去买空间,去买域名嘛,其实也没必要,我们只是学习,测试之 ...