Tunnels HDU - 4856
BFS寻找每个点到其他点的最小距离
再状压DP,DP[i][j] i二进制表示每个点的到达状态,j为当前所在点
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define pii pair<int,int>
#define CLR(a,b) memset(a,b,sizeof(a))
const int INF = 0x3f3f3f3f;
const int maxn = 40000;
char maze[20][20];
int vis[20][20];
int dis[20][20][20][20];
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
int n,m; int Dis[20][20][20][20]; struct Node{
int x,y;
int d;
Node(int x,int y,int d){
this->x = x;
this->y = y;
this->d = d;
}
};
queue<Node> Queue; void bfs(int x,int y)
{
vis[x][y] = 1;
dis[x][y][x][y] = 0;
Queue.push(Node(x,y,0));
while(Queue.size()){
int nx = Queue.front().x;
int ny = Queue.front().y;
int nd = Queue.front().d;
Queue.pop();
for(int i=0;i<4;i++){
if(nx + dx[i] >=1 && nx + dx[i] <=n && ny + dy[i] >=1 && ny + dy[i] <= n){
if(!vis[nx + dx[i]][ny + dy[i]] && maze[nx + dx[i]][ny + dy[i]] == '.'){
dis[x][y][nx + dx[i]][ny + dy[i]] = nd + 1;
vis[nx + dx[i]][ny + dy[i]] = 1;
Queue.push(Node(nx + dx[i],ny + dy[i],nd + 1));
}
}
}
}
} int dp[maxn][20];
int POW[20];
int mm[20][5];
int flag = 0; void solve()
{
POW[0] = 1;
for(int i=1;i<20;i++){
POW[i] = POW[i-1]*2;
} CLR(dp,0x3f);
for(int i=0;i<m;i++)
dp[1<<i][i] = 0; for(int i=1;i<POW[m];i++){
for(int j=0;j<m;j++){
if((i&POW[j]) == POW[j]){ int n = i^POW[j];
for(int k=0;k<m;k++){
if( (n&POW[k]) == POW[k]){
int a = mm[k][3];
int b = mm[k][4];
int aa = mm[j][1];
int bb = mm[j][2]; dp[i][j] = min(dp[n][k] + dis[a][b][aa][bb],dp[i][j]);
// cout<<dp[i][j]<<endl;
}
}
}
}
} } int main()
{
// freopen("in.txt","r",stdin);
while(cin>>n>>m){
for(int i=1;i<=n;i++){
scanf("%s",maze[i]+1);
}
for(int i=0;i<20;i++) for(int j=0;j<20;j++) for(int k=0;k<20;k++) for(int l=0;l<20;l++) dis[i][j][k][l] = INF;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(maze[i][j] == '.'){
CLR(vis,0);
bfs(i,j);
}
}
}
for(int i=0;i<m;i++){
cin>>mm[i][1]>>mm[i][2]>>mm[i][3]>>mm[i][4];
}
solve();
int ans = INF;
for(int i=0;i<m;i++){
ans = min(dp[POW[m]-1][i],ans);
}
if(ans == INF){
cout<<-1<<endl;
}
else
cout<<ans<<endl;
}
return 0;
}
Tunnels HDU - 4856的更多相关文章
- hdu 4856 Tunnels(bfs+状态压缩)
题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...
- HDU 4856 Tunnels(BFS+状压DP)
HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...
- hdu 4856 Tunnels
http://acm.hdu.edu.cn/showproblem.php?pid=4856 这道题就是搜索BFS+状压dp,把所经过的隧道的状态用二进制表示,然后dp就行.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 ...
- 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,惊险写出 现在回头想发现当时有点呆, ...
- 状压dpHDU - 4856
J - Tunnels HDU - 4856 题目大意:地图上有些管道,在管道行走里不需要花费时间,但从一个管道的出口走到另一个管道的入口则需要花费时间,问走完所有管道最短的时间,如果不行,则输出-1 ...
随机推荐
- wait-for
Use a tool such as wait-for-it, dockerize, or sh-compatible wait-for. These are small wrapper script ...
- Android编码学习之Adapter
1. Apter的作用 Adapter是将数据绑定到UI界面上的桥接类.Adapter负责创建显示每个项目的子View和提供对下层数据的访问.Adapter的作用就是将要在列表内显示的数据和列表本身结 ...
- 使用Git Subtree在多个项目中共用同一个子项目
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/8427796.html 场景一:已有一个大项目,需要把其中一部分内容独立出来作为共用子项目,被其他项目引用 一: ...
- 每天一个linux命令:du
1.命令简介 du (Disk usage) 用来计算每个文件的磁盘用量,目录则取总用量. 2.用法 用法:du [选项]... [文件]... 或:du [选项]... --files0-from= ...
- 每天一个linux命令(6):cp
1.命令简介 cp(Copy file):将源文件复制至目标文件,或将多个源文件复制至目标目录. 2.用法 cp [选项]... [-T] 源文件 目标文件 或:cp [选项]... 源文件... 目 ...
- mysql 线程等待时间,解决sleep进程过多的办法
如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800. wait_timeout 过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统 ...
- Git diff结果显示分析
1.diff的三种格式: 正常格式(normal diff) 上下文格式(context diff) 合并格式(unified diff) 2.示例文件为了便于讲解,先新建两个示例文件.第一个文件叫做 ...
- ionic3 表单输入元素input的三种事件
1.onblur事件 onblur事件即为失去焦点时触发的事件,而所谓的焦点就是一闪一闪的光标.而ionic中onblur则为ionBlur,具体用法如下: //html<ion-input [ ...
- Fluent动网格【11】:弹簧光顺
动网格除了前面讲了很多的关于运动指定之外,另一个重要主题则为网格的更新. 在部件运动之后,不可避免的会造成网格形状的变化,如若不对网格加以控制,在持续运动的过程中,则可能造成网格极度变形.歪曲率过大, ...
- 禅道项目管理系统整合Selenium IDE的思路
前两天说用过Selenium IDE产生了一些想法,这里做一些整理. 传统的测试人员管理测试用例,基本都是用Excel.这没什么不好的,也没什么好的.如果通过管理系统来管理用例,相对来说,少了一些简便 ...