bzoj 1556: 墓地秘密【状压dp+spfa】
显然是状压,显然不可能把所有格子压起来
仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节……这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N=105,dx[]={0,0,1,-1},dy[]={1,-1,0,0};
int n,m,t,a[N][N],f[70005][65],x[N],y[N],bx,by,dis[N][N][5],id[N][5],tot;
char c[N][N];
bool v[N][N];
struct qwe
{
int x,y;
qwe(int X=0,int Y=0)
{
x=X,y=Y;
}
};
bool ok(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m&&c[x][y]!='#';
}
void spfa(int sx,int sy,int s)
{//cerr<<sx<<" "<<sy<<endl;
if(!ok(sx,sy))
return;
// cerr<<s<<endl;
queue<qwe>q;
memset(dis,0x3f,sizeof(dis));
dis[sx][sy][0]=dis[sx][sy][1]=dis[sx][sy][2]=dis[sx][sy][3]=0;
v[sx][sy]=1;
q.push(qwe(sx,sy));
while(!q.empty())
{
int x=q.front().x,y=q.front().y;
q.pop();
v[x][y]=0;
for(int j=0;j<4;j++)
if(ok(x+dx[j],y+dy[j]))
for(int k=0;k<4;k++)
if(dis[x+dx[j]][y+dy[j]][k]>dis[x][y][j]+(j!=k))
{
dis[x+dx[j]][y+dy[j]][k]=dis[x][y][j]+(j!=k);
if(!v[x+dx[j]][y+dy[j]])
{
v[x+dx[j]][y+dy[j]]=1;
q.push(qwe(x+dx[j],y+dy[j]));
}
}
}
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
a[s][id[i][j]]=min(a[s][id[i][j]],dis[x[i]+dx[j]][y[i]+dy[j]][k]+(dx[j]+dx[k]!=0||dy[j]+dy[k]!=0));
}
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
scanf("%s",c[i]+1);
for(int i=1;i<=t;i++)
scanf("%d%d",&x[i],&y[i]);
scanf("%d%d",&bx,&by);
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
id[i][j]=++tot;
memset(a,0x3f,sizeof(a));
for(int i=1;i<=t;i++)
for(int j=0;j<4;j++)
spfa(x[i]+dx[j],y[i]+dy[j],id[i][j]);//,cerr<<x[i]<<" "<<dx[j]<<" "<<y[i]<<" "<<dy[j]<<endl;
spfa(bx,by,tot+1);
// for(int i=1;i<=tot+1;i++)
// {
// for(int j=1;j<=tot+1;j++)
// cerr<<a[i][j]<<" ";
// cerr<<endl;
// }
memset(f,0x3f,sizeof(f));
f[0][tot+1]=0;
for(int i=0,len=(1<<t)-1;i<=len;i++)
for(int j=1;j<=tot+1;j++)
for(int k=1;k<=tot;k++)
f[i|(1<<((k-1)/4))][k]=min(f[i|(1<<((k-1)/4))][k],f[i][j]+a[j][k]+1);
int ans=1e9;
for(int i=1;i<=tot;i++)
ans=min(ans,f[(1<<t)-1][i]);
printf("%d\n",ans);
return 0;
}
bzoj 1556: 墓地秘密【状压dp+spfa】的更多相关文章
- bzoj 1556 墓地秘密 —— 状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1556 预处理出两个障碍四个方向之间的距离(转弯次数),就可以状压DP了: 但预处理很麻烦.. ...
- 洛谷P2761 软件补丁问题(状压DP,SPFA)
题意 描述不清... Sol 网络流24题里面怎么会有状压dp?? 真是狗血,不过还是简单吧. 直接用$f[sta]$表示当前状态为$sta$时的最小花费 转移的时候枚举一下哪一个补丁可以搞这个状态 ...
- BZOJ 1087 题解【状压DP】
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3112 Solved: 1816[Submit][ ...
- BZOJ 4000: [TJOI2015]棋盘( 状压dp + 矩阵快速幂 )
状压dp, 然后转移都是一样的, 矩阵乘法+快速幂就行啦. O(logN*2^(3m)) ------------------------------------------------------- ...
- BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )
状压dp.... 我已开始用递归结果就 TLE 了... 不科学啊...我dp基本上都是用递归的..我只好改成递推 , 刷表法 将全部公司用二进制表示 , 压成一个数 . 0 表示破产 , 1 表示没 ...
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- HDU 4284 状压dp+spfa
题意: 给定n个点 m条无向边 d元. 以下m行表示每条边 u<=>v 以及花费 w 以下top 以下top行 num c d 表示点标为num的城市 工资为c 健康证价格为d 目标是经过 ...
- bzoj 2669 题解(状压dp+搜索+容斥原理)
这题太难了...看了30篇题解才整明白到底咋回事... 核心思想:状压dp+搜索+容斥 首先我们分析一下,对于一个4*7的棋盘,低点的个数至多只有8个(可以数一数) 这样的话,我们可以进行一个状压,把 ...
- BZOJ 2004 公交线路(状压DP+矩阵快速幂)
注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...
- BZOJ 1226 学校食堂(状压DP)
状压DP f(i,j,k)表示前i−1个人已经吃了饭,且在i之后的状态为j的人也吃了饭(用二进制表示后面的状态),最后吃的那个人是i之后的第k个 (注意k可以是负数) 然后 如果j&1=1那么 ...
随机推荐
- ACM常用模板整理
线段树单点修改区间查询 #include<stdio.h> #include<string.h> #include<algorithm> using namespa ...
- [Bzoj1499][NOI2005]瑰丽华尔兹[简单DP]
1499: [NOI2005]瑰丽华尔兹 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 1714 Solved: 1042[Submit][Status ...
- 干掉H5audio音频标签的下载按钮
audio::-internal-media-controls-download-button {display:none;}audio::-webkit-media-controls {overfl ...
- Android之怎样实现滑动页面切换【Fragment】
Fragment 页面切换不能滑动 所以对于listview 能够加入的左右滑动事件 .不会有冲突比如(QQ的好友列表的删除) Fragment 和viewpager 的差别 Viewpager ...
- CentOS 6.x Radius
CentOS 6.x Radius 一. 实现环境: 1.系统:CentOS release 6.6 (Final) 2.需要软件包: 1) freeradius-2.1.12-6.e16.x ...
- react 路由 react-router@3.2.1
react路由,4.x的差异还是比较大,暂时还是3.x的版本 安装: npm install -S react-router@3.x 配置: import { Router, Route, hashH ...
- MySQL基础笔记(四) 索引
一.什么是索引 索引(Index),可以看作一个指针,指向表里的数据.当数据库没有索引时,查找信息通常是全表扫描:使用了索引,它就会直接引导到数据在表里的准确物理位置. 优点:索引的主要目的是提高数据 ...
- M公司入职记
非常遗憾,我又跳槽了,到传说中的M公司,第一天就体会到了,神马叫差距. 要求9点30到,提前10分钟到了前台.前台MM懵懂的跟我说入职找人事,好吧. 电话联系相关人等,等到10点左右,被引导到一位不知 ...
- 解决运行scrapy是报错No module named cryptography,解决cryptography的安装问题,解决libffi的安装问题
在linux下配置完运行是出现ImportError: No module named cryptography.hazmat.bindings.openssl.binding的错误.原因是crapt ...
- 百万级PHP网站Poppen.de的架构分享心得
在了解过世界最大的PHP站点,Facebook的后台技术后, 今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flick ...