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 ...
随机推荐
- hdu3315 /最大权最佳匹配(最大权下尽量不改变次序)(有权田忌赛马类问题)/费用流
题意:2个人比赛,每场比赛有得分,每场每人派一支圣兽( brute ,字典翻译为畜生,感觉这里不太符╮(╯▽╰)╭),有攻击力和血条...一堆规则... 合理安排,让1号人获得最大分数,并尽量不要改变 ...
- Unity3D 异步加载 在 场景加载 中的使用
异步加载 我们想一想玩过的一些游戏,基本都会有加载界面——因为游戏场景数据较大,所以需要加载一小段时间.那为什么一些2D游戏也会有加载界面呢?按理说2D游戏场景会很小,这样做是为了让游戏跑在低端设备上 ...
- 洛谷——P1290 欧几里德的游戏
P1290 欧几里德的游戏 题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的 ...
- Android-一张图理解MVP的用法
M和V通过P交互,M做了两件事,开启子线程做耗时操作,然后使用原生的Hander方式切回主线程回调结果给P. M做的两件事也可以使用比较流行的rxjava实现: 备注:图片不清晰可以看这里
- HDD磁盘,非4K无以致远
机械硬盘的未来要靠高容量作为依托,在财报中,希捷表示未来18个月内它们将推出14和16TB机械硬盘,而2020年20TB机械硬盘就将诞生.也有资料显示,3.5英寸100TB硬盘大概在2025年就能面世 ...
- ios实现下载图片的裁减和显示
使用如下的方法可以裁减的同时保证了不丢失像素. - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ // Set ...
- linxu下的shell脚本加密,shell生成二机制可执行文件
再安全的加密也抵不过逆向,斗智斗勇吧,持续加密持续破解 1.简单的加密:gzexe file.sh 2.使用shc加密:下载地址:http://www.datsi.fi.upm.es/~frosal/ ...
- Spring-boot和Spring-Cloud遇到的问题
1.spring cloud 使用 feign 启动报错 错误信息 org/springframework/cloud/client/loadbalancer/LoadBalancedRetryFa ...
- weex 小结
1. import 文件时,必须引入全称,不能省略 .vue import mEcharts from '../components/Echarts.vue' 2.weex 的 cli 中没有 配置 ...
- 理解CSS中的BFC(块级可视化上下文)[译]
开篇 一些元素,如float元素,如position为absolute,inline-block,table-cell或table-caption的元素,以及overflow属性不为visible的元 ...