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的更多相关文章

  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

    http://acm.hdu.edu.cn/showproblem.php?pid=4856 这道题就是搜索BFS+状压dp,把所经过的隧道的状态用二进制表示,然后dp就行.bfs求出每两个隧道的最短 ...

  4. hdu 4856 Tunnels (记忆化搜索)

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

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

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

  6. hdu 4856 Tunnels 状态压缩dp

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

  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. 状压dpHDU - 4856

    J - Tunnels HDU - 4856 题目大意:地图上有些管道,在管道行走里不需要花费时间,但从一个管道的出口走到另一个管道的入口则需要花费时间,问走完所有管道最短的时间,如果不行,则输出-1 ...

随机推荐

  1. mysql多实例配置下,用脚本启动mysql时,出现Please read "Security" section of the manual to find out how to run mysqld as root!

    [root@localhost 3308]# mysqld stop170414 0:35:28 [Note] --secure-file-priv is set to NULL. Operation ...

  2. 【Apache】Apache的安装和配置

    Apache是世界非常流行的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一. Apache在Win7上的安装 下载apa ...

  3. 【PHP】PHP的安装和配置

    PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于W ...

  4. 【WCF】解析WCF服务的搭建

    WCF是.NET提供的一种服务,可以将自己写的程序(完成特定功能,比如从数据库中读取数据操作等)分装成服务以后,发布到服务器上.然后会生成一个网址,客户端在编程的时候,可以引用这个服务,使用这个服务中 ...

  5. Linux端口转发-rinted工具部署、配置、使用

    编者按: 近期由于公司开启定制项目规划,对于每个项目都会开启一个测试服务器,实施方会用到测试服务器的ssh端口.mysql端口.web端口,为了节省资源(公网IP.服务器资源复用),基于rinted工 ...

  6. Android 看源码学 Binder

    参考:https://jekton.github.io/2018/04/07/binder-why-RemoteListenerCallback-works/ 参考:https://jekton.gi ...

  7. Fortran一个获取硬件系统信息的函数库

    此函数库提供了 Visual Fortran 上获取硬盘ID,CPU编号,windows安装时间及文件头部校验的四个函数.可用于简单的程序加密.(但切勿用于商业性很强的地方)              ...

  8. HTTP缓存及其合理使用

    以前以为HTTP缓存是个简单的事,项目中遇到后才发觉关于缓存实践有挺深的学问. from几篇文章详见: 使用 HTTP 缓存:Etag, Last-Modified 与 Cache-Control 合 ...

  9. C语言——数组名、取数组首地址的区别(一)

    目录: 1. 开篇 2. 论数组名array.&array的区别 3. array.&array的区别表现在什么地方 4. 讨论 5. 参考 1.开篇 很多博客和贴吧都有讨论这个话题, ...

  10. mac:Go安装和配置+GoLand安装和使用之完整教程

    前言 作为一个go语言程序员,觉得自己有义务为go新手开一条更简单便捷的上手之路.纵使网上教程很多,但总不尽人意.go的入门门槛还是非常低的,无论是安装还是使用. go安装 go 语言支持以下系统:  ...