HDU 4856 Tunnels(BFS+状压DP)
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)相关推荐
- Tunnels HDU - 4856 (bfs状压dp)
Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...
- Hdu 4856 Tunnels(状压dp)
题目链接 Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU - 4856 Tunnels(哈密顿路径+状压dp)
题目链接:点击查看 题目大意:给出一个n*n的正方形网格,其中"."表示可以走的路,"#"表示障碍物,每次可以向上下左右任意方向走1格,花费1单位时间,再给出m ...
- HDU 3001 三进制状压DP
HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...
- HDU-4856 Tunnels(BFS状压DP)
Tunnels http://acm.hdu.edu.cn/showproblem.php?pid=4856 Time Limit: 3000/1500 MS (Java/Others) Mem ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- QDUOJ 来自xjy的签到题(bfs+状压dp)
来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,'#'表示爱丽丝不能到达这个格子,爱丽丝每1分钟 ...
- HDU4856:Tunnels (BFS 状压dp)
Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his eyes, the city is ...
- hdu 4568 bfs + 状压dp
//这题的数据是不是有问题... 不考虑宝藏一个也拿不到也能AC... 1 #include "bits/stdc++.h" 2 using namespace std; 3 co ...
最新文章
- 利用JS判断是手机端还是PC端 浏览网站
- 同底数幂比较大小方法_初中数学解题技法19.幂的运算
- Oracle优化之表连接方式
- 让你的系统“坚挺不倒”的最后一个大招——「降级」
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
- Vineyard 加入 CNCF Sandbox,将继续瞄准云原生大数据分析领域
- QQ组件可导致IE10无响应
- .net core3.1 下由Autofac接管IOC
- Layui导航树美化
- 移动端,h5页面1px 1像素边框过粗解决方案
- spark.network.timeout参数入门
- 华为p10应用市场无法连接服务器,华为p10如何连接电脑及没反应怎么解决【图文教程】...
- 博为峰JavaEE技术文章 ——MyBatis RowBounds分页
- python求两个数的最大公约数_python中求最大公约数的三种方法
- VS Code:推荐插件 - HTML格式化(包括JS、CSS)
- Hololens学习(一)安装 部署Hololens开发环境
- PS缩小图层兼如何使用蒙版
- 智慧水务信息化平台建设,实现供水一体化管控
- nest-mysql:RBAC权限管理
- 数字化高程模型的表达方法