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 ...
随机推荐
- 小窥React360——用React创建360全景VR体验
前言 混迹VR届的发烧友兼开发者们一定不要错过这款FaceBook推出的跨端VR开发框架——React360,称为360全景体验框架更为准确,因为其前身是FaceBook和Oculus2017年 ...
- Codeforces Round #266 (Div. 2) C. Number of Ways
You've got array a[1], a[2], ..., a[n], consisting of n integers. Count the number of ways to split ...
- [CSS3] Target HTML Elements not Explicitly set in the DOM with CSS Pseudo Elements (Blockquotes)
Pseudo elements allow us to target elements that are not explicitly set in the DOM. Using ::before : ...
- Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life
Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life ...
- Python--学习过程
基础篇 Python基础篇 Python的数据类型 作业总结
- hdu 4707 Pet(DFS && 邻接表)
Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- VS2012,VS2010无法生成dll程序集的解决办法
在我们做项目的时候总会遇到dll程序集无法生成导致各种问题. 通常我们的做法就是清理项目,然后重新生成,或者直接到bin目录下删除所有dll,然后重新生成. 有时候某几个dll就是不生成. 这时候就需 ...
- 嵌入式学习笔记(综合提高篇 第二章) -- FreeRTOS的移植和应用
1.1 资料准备和分析 上章节通过实现双机通讯,了解如何设计和实现自定义协议,不过对于嵌入式系统来说,当然不仅仅包含协议,还有其它很多需要深入学习了解的知识,下面将列出我在工作和学习上遇到的嵌入 ...
- 【转载】C# sleep 和wait的区别
eep和wait都是使线程暂时停止执行的方法,但它们有很大的不同. 1. sleep是线程类Thread 的方法,它是使当前线程暂时睡眠,可以放在任何位置. 而wait,它是使当前线程暂时放弃对象的使 ...
- C# -- 推断字符能否转化为整形
int iNum = 0; string sNumber = "1003"; int iResult = 0; int.TryParse(sNumber, out iResult) ...