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. C语言结构体变量私有化

    操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...

  2. PL/SQL学习笔记程序单元

    一:程序单元组成 一个PL/SQL程序单元主要包括三部分: 声明与定义部分:声明变量.常量.类型等:定义过程.函数等: 执行部分:执行PL/SQL语句:调用过程.参数:处理游标等: 异常处理部分:处理 ...

  3. tmunx error:invalid option: status-utf8 invalid option: utf8

    修改为:set-window-option -gq mouse off set-window-option -gq mode-mouse off set-option -gq status-utf8 ...

  4. centos7.0安装cuda驱动

    00.CUDA简介 CUDA和GPU的并行处理能力来加速深度学习和其他计算密集型应用程序 01.CPU+GPU协同架构 02.部署环境 [docker@lab-250 ~]$ cat /etc/*re ...

  5. iframe之间操作记录

    1.watch.js (function ($) { $.fn.watch = function (callback) { return this.each(function () { //缓存以前的 ...

  6. mac ssh 连接超时

    打开终端,进入,/etc/ssh.sudo vi ssh_config 最后一行添加 ServerAliveInterval30 然后保存就可以了

  7. 【C++】C++中typedef、auto与decltype的作用

    typedef 类型别名(type alias)是一个名字,使用typedef不会真正地创建一种新的数据类型,它只是已经存在数据类型的一个新名称.语法: typedef type name; 其中ty ...

  8. UltraVNC 简体中文版 1.2.2.1

    1.专门针对WinXP进行编译,同时适用XP之后的Windows版本(XP/Vista/8.1/10/2003/2008/2012): 2.配置低的计算机,Win8.1之前的系统,需要安装Mirror ...

  9. SQL注入学习资料总结

    转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html  什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...

  10. C语言 · 猜算式

    题目:猜算式 看下面的算式: □□ x □□ = □□ x □□□ 它表示:两个两位数相乘等于一个两位数乘以一个三位数. 如果没有限定条件,这样的例子很多. 但目前的限定是:这9个方块,表示1~9的9 ...