传送门
对于每个门进行一次bfs,得出每个点到每个门的时间
然后二分时间,每次建图dinic
S到空地连一条容量1的边,每个空地到可到达的门连一条容量1的边,每个门到T连一条容量为时间的边。
网络流水过。

#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define for(i,j,k) for (int i=j;i<=k;i++)
#define P 25
#define N 500
#define M 300000
#define R 500
#define inf 0x3f3f3f3f
const int c[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct ppp{int v,len,next,flow;void init(){len=flow;}
}e[M];
int head[50005],q[50005],d[50005],blank[R],door[R],point[R][R+5];
int id[P][P],map[R][R],rec[R][R+5],isdoor[R];
int cnt,s,t,blanks,doors,n,m;
char src[P][P];
void ins(int u,int v,int len){e[++cnt].v=v;e[cnt].len=e[cnt].flow=len;e[cnt].next=head[u];head[u]=cnt;
}
void add(int u,int v,int len){ins(u,v,len); ins(v,u,0);}
int bfs(){memset(d,0,sizeof(d));int x,v,h=0,W=1,i;d[q[1]=s]=1;while (h<W){x=q[++h];i=head[x];while(i){if (!d[v=e[i].v]&&e[i].len){d[v]=d[x]+1;q[++W]=v;}i=e[i].next;}}if (d[t]) return 1;return 0;
}
int del(int x,int flow){if (x==t) return flow;int rest=flow,v,k,i=head[x];while (i&&rest){if (e[i].len&&d[v=e[i].v]==d[x]+1){k=del(v,min(rest,e[i].len));if (!k) d[v]=0;e[i].len-=k;e[i^1].len+=k;rest-=k;}i=e[i].next;}return flow-rest;
}
void build(int mid){for(i,2,cnt) e[i].init();for(i,1,doors) for(j,mid+1,R) e[rec[i][j]].len=0;
}
void Build(int &l,int &r){int tx,ty;scanf("%d%d",&n,&m);for(i,1,n) scanf("%s",src[i]+1); for(i,1,n) for(j,1,m){if (src[i][j]=='.') blank[++blanks]=id[i][j]=++cnt;else if (src[i][j]=='D'){door[++doors]=id[i][j]=++cnt;isdoor[cnt]=1;}}memset(map,63,sizeof(map));for(i,1,cnt) map[i][i]=0;for(i,1,n) for(j,1,m) if (id[i][j]) for(k,0,3){tx=i+c[k][0];ty=j+c[k][1];if (id[tx][ty]) map[id[i][j]][id[tx][ty]]=1;}for(k,1,cnt)if(!isdoor[k])for(i,1,cnt) for(j,1,cnt) map[i][j]=min(map[i][j],map[i][k]+map[k][j]);cnt=blanks;for(i,1,doors) for(j,1,R)point[i][j]=++cnt;s=0;t=cnt+1;cnt=1;for(i,1,blanks){add(s,i,1);int res=inf;for (j,1,doors) res=min(res,map[blank[i]][door[j]]);l=max(l,res);}for(i,1,doors){int I=door[i],J;for(j,1,blanks)if (map[I][J=blank[j]]<inf) add(j,point[i][map[I][J]],1);}for(i,1,doors) for(j,1,R-1) add(point[i][j],point[i][j+1],inf);for(i,1,doors) for(j,1,R){add(point[i][j],t,1);rec[i][j]=cnt-1;}
}
int jud(int mid){build(mid);int flow=0;while (bfs()) flow+=del(s,inf);return flow==blanks;
}
int main(){int l=0,r=R,mid,ans=inf;Build(l,r);while (l<r){mid=(l+r)/2;if (jud(mid)) r=ans=mid; else l=mid+1; }if (ans==inf) printf("impossible");else printf("%d\n",ans);
}

bzoj1189: [HNOI2007]紧急疏散evacuate相关推荐

  1. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

  2. bzoj1189 [HNOI2007]紧急疏散EVACUATE spfa+网络流+二分

    这个题是非常暴力的匹配问题. 首先最好想的思路是给每个人分门的决策, 每个人到每个门的距离直接暴力最短路即可 但不能算出一个门被多个人经过的情况 所以就有了暴力的想法,再给每个人.对每一个门分配一个时 ...

  3. bzoj1189 [HNOI2007]紧急疏散evacuate(二分答案+bfs+最大流判是否满流)

    首先bfs处理出每个人到每个门所需的时间.然后二分答案,对于所有人能到的所有门,建边,边权为1,从源点向所有人建边,边权为1,从所有门向汇点建边,边权为mid(最多出去mid个人),dinic跑最大流 ...

  4. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  5. 有趣题目和认知合集(持续更新)

    写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...

  6. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

  7. [线性规划与网络流24题] 网络流常见模型

    最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...

  8. 【HNOI2007】紧急疏散

    题面 题解 \(\text{HNOI2007}\)真的恐怖 这是集合了所罗门的咒语,胜负一子等神仙题和码农题的一年 所以这道题非常码 二分答案,将门拆点,于是就变成了一个二分图匹配的题目 反正很恶心 ...

  9. BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]

    1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1435  Solv ...

  10. [HNOI2007] 分裂游戏

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1460  Solved: 889 [Submit][Sta ...

最新文章

  1. 如何零基础开始自学Python编程
  2. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
  3. 2016第一季度目标
  4. 华为鸿蒙系统明年8月份,华为鸿蒙系统明年上线,力争第五大操作系统,能否成功?...
  5. 如何做带宽估计和丢包策略
  6. C++socket编程(七):7.1 http协议讲解,通过抓包和telnet分析
  7. Spring4-自动装配Beans-按属性的数据类型自动装配Bean
  8. TensorFlow2.0:单层感知机梯度计算
  9. 【VS2010学习笔记】【异常处理】一(无法启动此程序,因为计算机中丢失libiconv-2.dll)
  10. paip.提升用户体验与安全性----cookie盗用检测
  11. 简单的学生管理系统详解(附源码)
  12. 两台电脑通过网线直连共享数据(超详细)
  13. 文件是否存在 FileExists 方法
  14. 『Python开发实战菜鸟教程』实战篇:一文带你了解人脸识别应用原理及手把手教学实现自己的人脸识别项目
  15. 分糖果(candy)
  16. Flutter中的圆角和圆形效果
  17. 新随笔--读书笔记《学会提问》:学习提出好问题的思维方法
  18. get、put、post、delete含义与区别
  19. div包video在某些电脑或者浏览器上出现黑边
  20. UBTC在2019,潮水褪去后的价值凸显

热门文章

  1. java读者信息管理课程设计_Java课程设计—学生成绩管理系统(201521123002 林楚虹)...
  2. JSHOP2学习1:环境配置(超详细教程)
  3. Android集成Bmob后端云
  4. 基于XPDL2.0的过程定义
  5. H3C模拟器2012鼎杰终极版的基本使用教程
  6. 基于bert的platos republic i ii情绪分析和可视化
  7. matlab教程黄金分割,Matlab程序设计在黄金分割法教学中的应用
  8. Kaggle泰坦尼克号预测——Last
  9. 用遗传算法解决VRP问题
  10. python动画精灵_Python小课堂第18课:如何使用Pygame做动画精灵和碰撞检测