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)的更多相关文章
- hdu 4856 Tunnels (bfs + 状压dp)
题目链接 The input contains mutiple testcases. Please process till EOF.For each testcase, the first line ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU-4856 Tunnels (BFS+状压DP)
Problem Description Bob is travelling in Xi’an. He finds many secret tunnels beneath the city. In hi ...
- hdu 4856 Tunnels(bfs+状态压缩)
题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- 孤岛营救问题(BFS+状压DP)
孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...
- QDUOJ 来自xjy的签到题(bfs+状压dp)
来自xjy的签到题 Description 爱丽丝冒险来到了红皇后一个n*n大小的花园,每个格子由'.'或'#'表示,'.'表示爱丽丝可以到达这个格子,‘#’表示爱丽丝不能到达这个格子,爱丽丝每1 ...
- HDU-3681-Prison Break(BFS+状压DP+二分)
Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...
随机推荐
- Android漫游记(6)---APP启动之旅(I)
Android基于Linux2.6+内核,我们看一张图,以对Android系统的架构有个感性的认识. 我们从Kernel层简单说明: 1.Kernel层:基于Linux2.6+内核.同一时候做了一些嵌 ...
- java中super的作用
super()的作用 super能够用来訪问超类的构造方法和被子类所隐藏的方法.假设子类中有方法与超类中的方法名称和參数同样,则超类中的方法就被隐藏起来,也就是说在子类中重载了父类中的方法. 引用父类 ...
- Linux 程序设计学习笔记----Linux下文件类型和属性管理
转载请注明出处:http://blog.csdn.net/suool/article/details/38318225 部分内容整理自网络,在此感谢各位大神. Linux文件类型和权限 数据表示 文件 ...
- 构建基于Javascript的移动CMS——生成博客(二).路由
在有了上部分的基础之后.我们就能够生成一个博客的内容--BlogPosts Detail.这样就完毕了我们这个移动CMS的差点儿基本的功能了,有了上节想必对于我们来说要获取一个文章已经不是一件难的事情 ...
- hdoj--2069--Coin Change(动态规划)
Coin Change Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 信息安全-加密:MD5
ylbtech-信息安全-加密:MD5 MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值( ...
- QT-项目文件说明
前言:如题. 一.项目文件概述 文件 功能 helloworld.pro 包含了项目信息 helloworld.pro.user 用户信息 hellodialog.h 自定义类hellodialog的 ...
- 关于getchar()的使用
'\n'表示换行.如果用键盘敲一下回车键的话,getchar会返回一个换行符.!='\n'意思是不等于换行符.ch应该是前边定义的一个char型变量, getchar()是一个从缓冲区获取字符的函数, ...
- Spark SQL 编程API入门系列之SparkSQL的依赖
不多说,直接上干货! 不带Hive支持 <dependency> <groupId>org.apache.spark</groupId> <artifactI ...
- MySQL 我自己常用的语句汇总
1,更新,根据一个表更新另一个表,比如批量同步外键 方法一: update 更新表 set 字段 = (select 参考数据 from 参考表 where 参考表.id = 更新表.id); up ...