hdu 4856 Tunnels
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的更多相关文章
- hdu 4856 Tunnels(bfs+状态压缩)
题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...
- HDU 4856 Tunnels(BFS+状压DP)
HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...
- hdu 4856 Tunnels (记忆化搜索)
Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- hdu 4856 Tunnels 状态压缩dp
Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- Tunnels HDU - 4856
BFS寻找每个点到其他点的最小距离 再状压DP,DP[i][j] i二进制表示每个点的到达状态,j为当前所在点 #include<iostream> #include<cstring ...
- HDU 4856 (状态压缩DP+TSP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...
- HDU 4856
http://acm.hdu.edu.cn/showproblem.php?pid=4856 西安邀请赛的一道题,这道题我们当时在现场最后1h才发现时状态压缩dp,惊险写出 现在回头想发现当时有点呆, ...
- ACM - 动态规划专题 题目整理
CodeForces 429B Working out 预处理出从四个顶点到某个位置的最大权值,再枚举相遇点,相遇的时候只有两种情况,取最优解即可. #include<iostream> ...
随机推荐
- JDK 和JRE的区别
JRE:Java Runtime Environment/Java运行时环境目标用户:只需要运行Java程序的用户JRE包含了:Deployment,User Interface Toolkits,I ...
- JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有 ...
- iOS UITextField 设置内边距
[self.yourTextField setValue:[NSNumber numberWithInt:5] forKey:@"_paddingTop"]; [self.your ...
- Android ExpandableListView BaseExpandableListAdapter (类似QQ分组列表)
分组列表视图(ExpandableListView) 和ListView不同的是它是一个两级的滚动列表视图,每一个组可以展开,显示一些子项,类似于QQ列表,这些项目来至于ExpandableListA ...
- iOS8 Core Image In Swift:视频实时滤镜
iOS8 Core Image In Swift:自己主动改善图像以及内置滤镜的使用 iOS8 Core Image In Swift:更复杂的滤镜 iOS8 Core Image In Swift: ...
- android 程序防止被360或者系统给kill掉
关于如果和防止android 程序防止被360kill掉之后重启的问题,肯定大家也搜索了好多方法,都不好使,对不对,什么增高权限了,什么进程优先级了,这些东西都不是我们可控的,所以有没有一些非常保险的 ...
- Sqlserver查询表结构信息-字段说明、类型、长度等信息
Sqlserver 中查询表结构信息-字段说明.类型.长度等信息综合语法. SELECT 表名 = d.name,--case when a.colorder=1 then d.name else ' ...
- 读取Excel数据绑定到Gridview进行显示
读取Excel数据绑定到Gridview进行显示示例代码. 读取excel代码 /// <summary> /// 读取Excel /// authon:codeo.cn /// < ...
- mwc config.h 中文注释
#ifndef CONFIG_H_ #define CONFIG_H_ /*************************************************************** ...
- div中的内容居中
要使div中的内容居中显示,不仅div要设定“text-align:centr" ,内置对象要添加margin:auto;属性才能使其在firefox等其他浏览器中也能居中.