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. hdu 4856 Tunnels (bfs + 状压dp)

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

  2. hdu 3247 AC自动+状压dp+bfs处理

    Resource Archiver Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Ot ...

  3. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. HDU-4856 Tunnels (BFS+状压DP)

    Problem Description Bob is travelling in Xi’an. He finds many secret tunnels beneath the city. In hi ...

  5. hdu 4856 Tunnels(bfs+状态压缩)

    题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...

  6. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  7. 孤岛营救问题(BFS+状压DP)

    孤岛营救问题 https://www.luogu.org/problemnew/show/P4011 用状压DP标记拿到钥匙的数量 #include<iostream> #include& ...

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

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

  9. HDU-3681-Prison Break(BFS+状压DP+二分)

    Problem Description Rompire is a robot kingdom and a lot of robots live there peacefully. But one da ...

随机推荐

  1. HDU 4365

    把涂色的格子按对称旋转至左上角. 当未涂色时,若要符合要求,则必须要求每一圈矩形都是上下左右对称的.注意是一圈的小矩形.对于N*N的阵,若最外层一圈的小矩形要符合要求,则(假设N%2==0)可以涂色的 ...

  2. 怎样改动 VC6.0 4.0 2010 打印预览界面上的文字

    前言:尽管早已下决心不再碰微软的东西,但手头的项目还得须要维护. 遇到问题还能解决. 问题由来: 之前的软件开发是基于中文环境开发的,建立项目的时候,选择了中文,为了方便客户使用.我们使用了静态编译的 ...

  3. 大菲波数 【杭电-HDOJ-1715】 附题+具体解释

    /* 大菲波数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  4. uva 10003 Cutting Sticks 【区间dp】

    题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...

  5. Android 四大组件学习之BroadcastReceiver四

    本节学习系统中特殊的广播接收者. 我们前面几节不是说了,当广播接受者一旦注冊到系统中,当系统发送的广播和你注冊的广播的action匹配时,系统就会启动广播接收者所在的进程.除非用户手动停止广播接收者所 ...

  6. 应用市场快速下载以及网页端调起APP页面研究与实现

    Github博文地址,此处更新可能不是非常及时. 好久没写博客了,好大一个坑. 正好,近期刚做完应用市场的快速下载功能,便拿来填了这个坑. 话说产品为了添加用户量,提升用户活跃度以及配合推广,更坑爹的 ...

  7. 17.QT键盘

    mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> 5 #include <Q ...

  8. UINavi中push控制器的时候隐藏TabBar

    当一个UITabbarController管理多个UINavigationController的时候,我们又从这每一个UINavigationController中push一个ViewControll ...

  9. POJ 3628 01背包 OR 状压

    思路: 1.01背包 先找到所有奶牛身高和与B的差. 然后做一次01背包即可 01背包的容积和价格就是奶牛们身高. 最后差值一减输出结果就大功告成啦! 2. 搜索 这思路很明了吧... 搜索的确可以过 ...

  10. c# ExecuteScalar()

    ExecuteScalar这个方法是从数据库中检索单个值返回值是object类型,必须用与它在数据库里存放的类型相同类型或者可以转换成的类型,比如数据是nchar类型值为 "123" ...