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那么 ...
随机推荐
- Codeforces 658C Bear and Forgotten Tree 3【构造】
题目链接: http://codeforces.com/contest/658/problem/C 题意: 给定结点数,树的直径(两点的最长距离),树的高度(1号结点距离其他结点的最长距离),写出树边 ...
- WebLogic中"域"的概念
WebLogic 版权声明:本文为博主原创文章,未经博主允许不得转载. WebLogic Server中的域是逻辑上相关的一组 WebLogic Server 资源,可以作为一个单元进行管理.一个域中 ...
- Go---Redis连接池
之前一篇文章介绍过使用redigo连接redis数据库处理,在使用中发现如果初始化一条链接连接redis做相关操作,使用中发现当两个程序交替使用redis时,先前建立的链接会断掉,只能每次操作的时候重 ...
- 【effective c++】模板与泛型编程
模板元编程:在c++编译器内执行并于编译完成时停止执行 1.了解隐式接口和编译期多态 面向对象编程总是以显式接口(由函数名称.参数类型和返回类型构成)和运行期多态(虚函数)解决问题 模板及泛型编程:对 ...
- java 实现打印当前月份的日历
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcTc0NTQwMTk5MA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- router-link的a样式变成div样式元素属性
<router-link tag="div" :to="itemChild.path"><span>{{itemChild.name}} ...
- nagios 安装配置(包含nrpe端)全 (三)
四.系统的配置: 1.介绍 在配置过程中涉及到的几个定义有:主机.主机组,服务.服务组.联系人.联系人组,监控时间.监控命令等. 最重要的有四点: 第一:定义监控哪些主机.主机组.服务和服务组: 第二 ...
- 【Mongodb教程 第一课 补加课1 】windows7 下安装mongodb 开启关闭服务
mongodb在2.2版本开始就不支持windows xp了(我想现在用xp的应该也是带着情怀的一部分人吧,我只是一个工匠而已),windows下server8 R2,64位,32位,只是32位只支持 ...
- C语言将10进制转为2进制
第一种方法: #include<stdio.h> void dectobin(int n); int main() { int x=0; scanf("%d",& ...
- 数据结构与算法问题 AVL二叉平衡树
AVL树是带有平衡条件的二叉查找树. 这个平衡条件必须保持,并且它必须保证树的深度是O(logN). 一棵AVL树是其每一个节点的左子树和右子树的高度最多差1的二叉查找树. (空树的高度定义为-1). ...