考虑二分答案然后判断,判断用网络流,S连每个人流量1,每个门按时间拆点,每个时间连T流量1,每个时间连下一个时间流量INF,然后每个人如果能在当前二分的时间内到达某个门,那么这个人连门的他到达的时间

然后跑最大流看是否满流来判断即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 200010
#define MAXM 1000010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
struct vec{int to;int fro;int v;
};
vec mp[MAXM];
int tai[MAXN],cnt;
int s,t;
int d[MAXN];
int q[MAXN];
int n,m;
char MP[30][30];
int dis[30*30][30*30];
int qx[30*30],qy[30*30],vis[30*30],hd,tl;
int T;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
bool kd[30*30],dor[30*30];
int rem;
int pt(int x,int y){return (x-1)*m+y;
}
inline void be(int x,int y,int z){mp[++cnt].to=y;mp[cnt].fro=tai[x];tai[x]=cnt;mp[cnt].v=z;
}
inline void bse(int x,int y,int z){be(x,y,z);be(y,x,0);
}
bool bfs(){  int i,x,y;  memset(d,0,sizeof(d));  d[s]=1;  hd=tl=0;  q[tl++]=s;  while(hd!=tl){  x=q[hd++];  for(i=tai[x];i;i=mp[i].fro){  y=mp[i].to;  if(mp[i].v&&(!d[y])){  d[y]=d[x]+1;  q[tl++]=y;  }  }  }  return d[t];
}
int dfs(int x,int mx){  if(x==t){  return mx;  }  int i,y,tt;  int re=0;  for(i=tai[x];i;i=mp[i].fro){  y=mp[i].to;  if(d[y]==d[x]+1&&mp[i].v){  tt=dfs(y,min(mx,mp[i].v));  mp[i].v-=tt;  mp[i^1].v+=tt;  mx-=tt;  re+=tt;  if(!mx){  return re;  }  }  }  if(!re){  d[x]=0;  }  return re;
}
void cal(int x,int y,int *dis){int i;T++;hd=tl=0;vis[pt(x,y)]=T;qx[tl]=x;qy[tl++]=y;memset(dis,0x3f,sizeof(dis));dis[pt(x,y)]=0;while(hd!=tl){x=qx[hd];y=qy[hd++];for(i=1;i<=4;i++){int xx=x+dx[i],yy=y+dy[i];if(vis[pt(xx,yy)]!=T&&MP[xx][yy]!='X'){dis[pt(xx,yy)]=dis[pt(x,y)]+1;vis[pt(xx,yy)]=T;if(MP[xx][yy]!='D'){qx[tl]=xx;qy[tl++]=yy;}}}}
}
bool OK(int x){int i,j;int N=pt(n,m);s=N*401+1;t=s+1;memset(tai,0,sizeof(tai));cnt=1;for(i=1;i<=N;i++){if(kd[i]){bse(s,i,1);for(j=1;j<=N;j++){if(dor[j]&&dis[i][j]<=x){bse(i,j+dis[i][j]*N,1);}}}if(dor[i]){for(j=1;j<x;j++){bse(i+j*N,i+(j+1)*N,INF);bse(i+j*N,t,1);}bse(i+x*N,t,1);}}int ans=0;while(bfs()){ans+=dfs(s,INF);}return ans==rem;
}
int main(){int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;i++){scanf("%s",MP[i]+1);}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(MP[i][j]=='.'){rem++;kd[pt(i,j)]=1;cal(i,j,dis[pt(i,j)]);}if(MP[i][j]=='D'){dor[pt(i,j)]=1;}}}int l=1,r=400;int ans=-1;while(l<=r){int mid=l+r>>1;if(OK(mid)){ans=mid;r=mid-1;}else{l=mid+1;}}if(ans==-1){printf("impossible\n");return 0;}printf("%d\n",ans);return 0;
}/**/

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. WAIC 2021 | 百度量子计算段润尧:从理论到实践谈量子人工智能
  2. 11行Python代码,发现了室友U盘的惊天秘密。
  3. mysql server 5.0的jdbc驱动_MySQL5.0的JDBC驱动程序(转
  4. 业务理解有偏差,产品和开发如何达成共识?
  5. charles抓包ios抓拍教程
  6. Asp.Net Core基于JWT认证的数据接口网关Demo
  7. 提升用户体验---自动邮编提示与验证地址
  8. VMware虚拟机安装教程
  9. 双参数cfar c语言代码,一种多目标环境下的SAR图像双参数CFAR检测方法与流程
  10. 你想成为一个什么样的人
  11. X-NUCA'2019部分题目WP
  12. synopsys 工具简介
  13. mc服务器对硬盘有要求吗,我的世界电脑配置要求是什么_我的世界电脑配置要求高吗_玩游戏网...
  14. 孤岛惊魂5 for Android,孤岛惊魂5手机版
  15. vue 精简教程(四) vuerouter 路由
  16. 解决Google人机验证reCaptcha失效问题
  17. 浅谈Docker底层原理
  18. eBay卖家用连连跨境支付将PayPal提现国内银行教程!
  19. Java计算幂的指数
  20. STM32MP157系列教程连载-硬件设计篇2:STM32MP1微处理器之电源篇

热门文章

  1. TypeError: __init__() got an unexpected keyword argument ‘rate‘
  2. LaTeX中的中英文字体设置、混排
  3. 挪威科技大学计算机硕士,挪威科技大学硕士留学申请条件
  4. UVALive - 8270 A Partial Order Relation 哈斯图边数
  5. hdu6638 Snowy Smile (最大权值和矩阵、线段树)
  6. 《炼数成金-Linux内核探秘》笔记4
  7. html flash 上传插件,flash 插件上传文件 | 浩然东方
  8. 双活数据中心解决方案
  9. 黑马程序员pink老师Javascript语法基础 | 总结
  10. OpenHarmony代码下载编译流程记录