BZOJ1189 [HNOI2007]紧急疏散evacuate
考虑二分答案然后判断,判断用网络流,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相关推荐
- 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...
[法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...
- bzoj1189 [HNOI2007]紧急疏散EVACUATE spfa+网络流+二分
这个题是非常暴力的匹配问题. 首先最好想的思路是给每个人分门的决策, 每个人到每个门的距离直接暴力最短路即可 但不能算出一个门被多个人经过的情况 所以就有了暴力的想法,再给每个人.对每一个门分配一个时 ...
- bzoj1189 [HNOI2007]紧急疏散evacuate(二分答案+bfs+最大流判是否满流)
首先bfs处理出每个人到每个门所需的时间.然后二分答案,对于所有人能到的所有门,建边,边权为1,从源点向所有人建边,边权为1,从所有门向汇点建边,边权为mid(最多出去mid个人),dinic跑最大流 ...
- 2019.4.summary
2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...
- 有趣题目和认知合集(持续更新)
写写对一些算法的理解,挂几个有意思的题,可能也会挂几个板子题 算法理解偏向于能懂即可,没有严格的证明 快乐几何 [1.2]Volatile Kite 点到直线 快乐搜与暴力 [2.4]Short Co ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
- [线性规划与网络流24题] 网络流常见模型
最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...
- 【HNOI2007】紧急疏散
题面 题解 \(\text{HNOI2007}\)真的恐怖 这是集合了所罗门的咒语,胜负一子等神仙题和码农题的一年 所以这道题非常码 二分答案,将门拆点,于是就变成了一个二分图匹配的题目 反正很恶心 ...
- BZOJ 1185: [HNOI2007]最小矩形覆盖 [旋转卡壳]
1185: [HNOI2007]最小矩形覆盖 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1435 Solv ...
- [HNOI2007] 分裂游戏
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1460 Solved: 889 [Submit][Sta ...
最新文章
- WAIC 2021 | 百度量子计算段润尧:从理论到实践谈量子人工智能
- 11行Python代码,发现了室友U盘的惊天秘密。
- mysql server 5.0的jdbc驱动_MySQL5.0的JDBC驱动程序(转
- 业务理解有偏差,产品和开发如何达成共识?
- charles抓包ios抓拍教程
- Asp.Net Core基于JWT认证的数据接口网关Demo
- 提升用户体验---自动邮编提示与验证地址
- VMware虚拟机安装教程
- 双参数cfar c语言代码,一种多目标环境下的SAR图像双参数CFAR检测方法与流程
- 你想成为一个什么样的人
- X-NUCA'2019部分题目WP
- synopsys 工具简介
- mc服务器对硬盘有要求吗,我的世界电脑配置要求是什么_我的世界电脑配置要求高吗_玩游戏网...
- 孤岛惊魂5 for Android,孤岛惊魂5手机版
- vue 精简教程(四) vuerouter 路由
- 解决Google人机验证reCaptcha失效问题
- 浅谈Docker底层原理
- eBay卖家用连连跨境支付将PayPal提现国内银行教程!
- Java计算幂的指数
- STM32MP157系列教程连载-硬件设计篇2:STM32MP1微处理器之电源篇
热门文章
- TypeError: __init__() got an unexpected keyword argument ‘rate‘
- LaTeX中的中英文字体设置、混排
- 挪威科技大学计算机硕士,挪威科技大学硕士留学申请条件
- UVALive - 8270 A Partial Order Relation 哈斯图边数
- hdu6638 Snowy Smile (最大权值和矩阵、线段树)
- 《炼数成金-Linux内核探秘》笔记4
- html flash 上传插件,flash 插件上传文件 | 浩然东方
- 双活数据中心解决方案
- 黑马程序员pink老师Javascript语法基础 | 总结
- OpenHarmony代码下载编译流程记录