HDU 4856 Tunnels

题目链接

题意:给定一些管道。然后管道之间走是不用时间的,陆地上有障碍。陆地上走一步花费时间1,求遍历全部管道须要的最短时间。每一个管道仅仅能走一次

思路:先BFS预处理出两两管道的距离。然后状态压缩DP求解,dp[s][i]表示状态s。停在管道i时候的最小花费

代码:

#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;
const int N = 20;
const int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
typedef pair<int, int> pii;
#define MP(a,b) make_pair(a,b)int g[N][N], vis[N][N], n, m, dp[(1<<15)][20];
char G[N][N];struct Pipe {int x1, y1, x2, y2;void read() {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);}
} p[N];int bfs(Pipe a, Pipe b) {queue<pii> Q;memset(vis, -1, sizeof(vis));Q.push(MP(a.x2, a.y2));vis[a.x2][a.y2] = 0;while (!Q.empty()) {pii now = Q.front();if (now.first == b.x1 && now.second == b.y1) return vis[now.first][now.second];Q.pop();for (int i = 0; i < 4; i++) {int xx = now.first + d[i][0];int yy = now.second + d[i][1];if (xx <= 0 || xx > n || yy <= 0 || yy > n || vis[xx][yy] != -1 || G[xx][yy] != '.') continue;vis[xx][yy] = vis[now.first][now.second] + 1;Q.push(MP(xx,yy));}}return -1;
}void build() {for (int i = 1; i <= m; i++) {for (int j = 1; j <= m; j++) {if (i == j) g[i][j] = 0;else g[i][j] = bfs(p[i], p[j]);}}
}int solve() {memset(dp, INF, sizeof(dp));for (int i = 1; i <= m; i++)dp[1<<(i - 1)][i] = 0;int ans = INF;for (int i = 0; i < (1<<m); i++) {for (int j = 1; j <= m; j++) {if (i&(1<<(j - 1))) {for (int k = 1; k <= m; k++) {if (i&(1<<(k - 1)) == 0 || g[k][j] == -1) continue;dp[i][j] = min(dp[i^(1<<(j - 1))][k] + g[k][j], dp[i][j]);}}if (i == (1<<m) - 1)ans = min(ans, dp[i][j]);}}if (ans == INF) return -1;return ans;
}int main() {while (~scanf("%d%d", &n, &m)) {for (int i = 1; i <= n; i++)scanf("%s", G[i] + 1);for (int i = 1; i <= m; i++)p[i].read();build();printf("%d\n", solve());}return 0;
}

HDU 4856 Tunnels(BFS+状压DP)相关推荐

  1. Tunnels HDU - 4856 (bfs状压dp)

    Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...

  2. Hdu 4856 Tunnels(状压dp)

    题目链接 Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  3. HDU - 4856 Tunnels(哈密顿路径+状压dp)

    题目链接:点击查看 题目大意:给出一个n*n的正方形网格,其中"."表示可以走的路,"#"表示障碍物,每次可以向上下左右任意方向走1格,花费1单位时间,再给出m ...

  4. HDU 3001 三进制状压DP

    HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...

  5. HDU-4856 Tunnels(BFS状压DP)

    Tunnels http://acm.hdu.edu.cn/showproblem.php?pid=4856 Time Limit: 3000/1500 MS (Java/Others)    Mem ...

  6. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  7. QDUOJ 来自xjy的签到题(bfs+状压dp)

    来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,'#'表示爱丽丝不能到达这个格子,爱丽丝每1分钟 ...

  8. HDU4856:Tunnels (BFS 状压dp)

    Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his eyes, the city is ...

  9. hdu 4568 bfs + 状压dp

    //这题的数据是不是有问题... 不考虑宝藏一个也拿不到也能AC... 1 #include "bits/stdc++.h" 2 using namespace std; 3 co ...

最新文章

  1. 利用JS判断是手机端还是PC端 浏览网站
  2. 同底数幂比较大小方法_初中数学解题技法19.幂的运算
  3. Oracle优化之表连接方式
  4. 让你的系统“坚挺不倒”的最后一个大招——「降级」
  5. zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
  6. Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域
  7. QQ组件可导致IE10无响应
  8. .net core3.1 下由Autofac接管IOC
  9. Layui导航树美化
  10. 移动端,h5页面1px 1像素边框过粗解决方案
  11. spark.network.timeout参数入门
  12. 华为p10应用市场无法连接服务器,华为p10如何连接电脑及没反应怎么解决【图文教程】...
  13. 博为峰JavaEE技术文章 ——MyBatis RowBounds分页
  14. python求两个数的最大公约数_python中求最大公约数的三种方法
  15. VS Code:推荐插件 - HTML格式化(包括JS、CSS)
  16. Hololens学习(一)安装 部署Hololens开发环境
  17. PS缩小图层兼如何使用蒙版
  18. 智慧水务信息化平台建设,实现供水一体化管控
  19. nest-mysql:RBAC权限管理
  20. 数字化高程模型的表达方法

热门文章

  1. 15 -python之文件操作
  2. maven:本地仓库有依赖但是idea报错找不到依赖Could not find artifact com.*.*
  3. 计算机学平面设计,学计算机平面设计专业好吗?
  4. 中国标准时间转换“XXXX-XX-XX”
  5. 使用urillb获取北京公交线路信息
  6. UVa 1607 与非门电路(Gates)
  7. 3dsmax完全安装到非系统盘的解决办法
  8. 研发部门管理的三驾马车
  9. 2021-03-19~20 大数据课程笔记 day58day59
  10. 转:Infoworld发布2009年度开源软件大奖