BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
Description
Farmer John has taken the cows to a vacation out on the ocean! The cows are living on N (1 <= N <= 15) islands, which are located on an R x C grid (1 <= R, C <= 50). An island is a maximal connected group of squares on the grid that are marked as 'X', where two 'X's are connected if they share a side. (Thus, two 'X's sharing a corner are not necessarily connected.) Bessie, however, is arriving late, so she is coming in with FJ by helicopter. Thus, she can first land on any of the islands she chooses. She wants to visit all the cows at least once, so she will travel between islands until she has visited all N of the islands at least once. FJ's helicopter doesn't have much fuel left, so he doesn't want to use it until the cows decide to go home. Fortunately, some of the squares in the grid are shallow water, which is denoted by 'S'. Bessie can swim through these squares in the four cardinal directions (north, east, south, west) in order to travel between the islands. She can also travel (in the four cardinal directions) between an island and shallow water, and vice versa. Find the minimum distance Bessie will have to swim in order to visit all of the islands. (The distance Bessie will have to swim is the number of distinct times she is on a square marked 'S'.) After looking at a map of the area, Bessie knows this will be possible.
Input
* Line 1: Two space-separated integers: R and C.
* Lines 2..R+1: Line i+1 contains C characters giving row i of the grid.
Deep water squares are marked as '.', island squares are marked as 'X',
and shallow water squares are marked as 'S'.
Output
* Line 1: A single integer representing the minimum distance Bessie has to swim to visit all islands.
Sample Input
XX.S
.S..
SXSS
S.SX
..SX
INPUT DETAILS: There are three islands with shallow water paths connecting some of them.
Sample Output
OUTPUT DETAILS: Bessie can travel from the island in the top left to the one in the middle, swimming 1 unit,
and then travel from the middle island to the one in the bottom right, swimming 2 units, for a total of 3 units.
HINT
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define _min(x,y) ((x)<(y)?(x):(y))
int tx[]={1,0,0,-1};
int ty[]={0,1,-1,0};
int map[55][55],dis[17][17],f[1<<15][17],idx[55][55],vis[55][55],dep[55][55],tot,Q[5050],cnt,n,m,l,r,p1,mp[1<<15];
char ch[55];
void bfs(int sx,int sy) {
int i; tot++; cnt++;
l=r=0;
Q[r++]=sx; Q[r++]=sy; idx[sx][sy]=cnt;
while(l<r) {
int x=Q[l++],y=Q[l++]; vis[x][y]=tot;
for(i=0;i<4;i++) {
int dx=x+tx[i],dy=y+ty[i];
if(dx<1||dx>n||dy<1||dy>m) continue;
if(map[dx][dy]==0&&vis[dx][dy]!=tot) {
vis[dx][dy]=tot; idx[dx][dy]=cnt;
Q[r++]=dx; Q[r++]=dy;
}
}
}
}
void dfs(int x,int y,int d) {
int i;Q[r++]=x; Q[r++]=y; dep[x][y]=d;
int tmp=idx[x][y];
dis[p1][tmp]=_min(dis[p1][tmp],d);
for(i=0;i<4;i++) {
int dx=x+tx[i],dy=y+ty[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=m) {
if(map[dx][dy]==0&&vis[dx][dy]!=tot) {
vis[dx][dy]=tot;
dfs(dx,dy,d);
}
}
}
}
void get_dis() {
p1++;
int i,j; tot++; dis[p1][p1]=0;l=r=0;
for(i=1;i<=n;i++) for(j=1;j<=m;j++) if(idx[i][j]==p1) Q[r++]=i,Q[r++]=j,vis[i][j]=tot,dep[i][j]=0;
while(l<r) {
int x=Q[l++],y=Q[l++];
for(i=0;i<4;i++) {
int dx=x+tx[i],dy=y+ty[i];
if(dx<1||dx>n||dy<1||dy>m) continue;
if(map[dx][dy]==1&&vis[dx][dy]!=tot) {
vis[dx][dy]=tot;
dfs(dx,dy,dep[x][y]+1);
}
}
}
}
int main() {
scanf("%d%d",&n,&m);
int i,j,k,o,q;
for(i=1;i<=n;i++) {
scanf("%s",ch+1);
for(j=1;j<=m;j++) {
if(ch[j]=='.') map[i][j]=2;
else if(ch[j]=='X') map[i][j]=0;
else map[i][j]=1;
}
}
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
if(!vis[i][j]&&map[i][j]==0) bfs(i,j);
}
}
memset(f,0x3f,sizeof(f));
for(i=1;i<=cnt;i++) f[1<<(i-1)][i]=0,mp[1<<(i-1)]=i;
memset(dis,0x3f,sizeof(dis));
for(i=1;i<=cnt;i++) get_dis();
int mask=(1<<cnt)-1;
for(i=1;i<mask;i++) {
for(o=i;o;o-=o&(-o)) {
j=mp[o&(-o)];
for(q=mask-i;q;q-=q&(-q)) {
k=mp[q&(-q)];
f[i|(1<<(k-1))][k]=_min(f[i|(1<<(k-1))][k],f[i][j]+dis[j][k]);
}
}
}
int ans=1<<30;
for(i=1;i<=cnt;i++) ans=_min(ans,f[mask][i]);
printf("%d\n",ans);
}
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS的更多相关文章
- BZOJ_1076_[SCOI2008]奖励关_状压DP
BZOJ_1076_[SCOI2008]奖励关_状压DP 题意: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛 ...
- BZOJ_2064_分裂_状压DP
BZOJ_2064_分裂_状压DP Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的 ...
- BZOJ_5369_[Pkusc2018]最大前缀和_状压DP
BZOJ_5369_[Pkusc2018]最大前缀和_状压DP Description 小C是一个算法竞赛爱好者,有一天小C遇到了一个非常难的问题:求一个序列的最大子段和. 但是小C并不会做这个题,于 ...
- hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Ot ...
- 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...
- [poj1185]炮兵阵地_状压dp
炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...
- [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp
管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...
- [bzoj1879][Sdoi2009]Bill的挑战_动态规划_状压dp
Bill的挑战 bzoj-1879 Sdoi-2009 题目大意: 注释:$1\le t \le 5$,$1\le m \le 15$,$1\le length \le 50$. 想法: 又是一个看数 ...
- [bzoj3717][PA2014]Pakowanie_动态规划_状压dp
Pakowanie bzoj-3717 PA-2014 题目大意:给你n个物品m个包,物品有体积包有容量,问装下这些物品最少用几个包. 注释:$1\le n\le 24$,$1\le m\le 100 ...
随机推荐
- iscroll API
概况 资料来源 http://cubiq.org/iscroll-4 http://www.cnblogs.com/wanghun/archive/2012/10/17/2727416.html ht ...
- Set 技巧之一
我们知道set中 用set<int,int>S; S.lower_bound(x): 查找Set中 第一个>=x的数,返回结果是指针. S.upper_bound(x):查找Set中 ...
- Java并发编程关键字synchronized的总结
一.对synchronized的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行. ...
- Nginx的Web管理界面收集
Nginx实在是太强大了!灰度发布.金丝雀发布.负载均衡就只需要简单的几行配置就可以实现,这些特性嗾使微软无法比拟的. 原来Nginx除了使用ngx_http_stub_status_module模块 ...
- 基于centos 创建stress镜像——源码安装stress
上一篇文章进行了yum安装stress,这次对stress进行源码编译安装,并且生成新的镜像 创建Dockerfile目录 [vagrant@localhost ~]$ mkdir -p /tmp/s ...
- python的websocket实现Tornado
1.使用flask的扩展: pip install flask-socketio 2.Tornado提供较好的ws(websocket)支持 参考:1.http://www.jianshu.com/p ...
- 单点登录CAS-Demo
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 1安全证书配置 2部署服务端CAS-Server 3部署CAS-Client 4测试SSO 1,安全证书配置 CAS默认 ...
- Solidworks做镜像 导致厚度为零的几何体怎么办
如下图所示,我想把1,2,3,4架子做一个镜像,但是提示错误 貌似只能用镜像实体,并且取消勾选"合并实体"
- 《大话操作系统——做坚实的project实践派》(7)
写操作系统内核须要了解一个详细计算平台的CPU,包含这个CPU里的寄存器和异常中断处理机制
- POJ 3928 Ping pong 树状数组模板题
開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...