BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)
Description
Input
Output
Sample Input
XXXXX
X...D
XX.XX
X..XX
XXDXX
Sample Output
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int oo=0x3f3f3f3f;
struct int_2{int TIME;int NO;};
struct pnt{
int hd;
int lyr;
int now;
}p[];
struct ent{
int twd;
int vls;
int lst;
int his;
}e[];
struct OVO{
int_2 pro;
int i;
int j;
};
int cnt;
int n,m;
int s,t;
int pnum;
char tmp[];
int no[][];
int mp[][];
bool vis[][];
bool hvv[][];
std::queue<int>Q;
std::queue<OVO>P;
std::vector<int>T[];
std::vector<int_2>dr[][];
void ade(int f,int t,int v)
{
cnt++;
e[cnt].twd=t;
e[cnt].vls=v;
e[cnt].his=v;
e[cnt].lst=p[f].hd;
p[f].hd=cnt;
return ;
}
bool bfs(void)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(mp[i][j]==)
{
while(!P.empty())
P.pop();
P.push((OVO){(int_2){,no[i][j]},i,j});
while(!P.empty())
{
OVO x=P.front();
P.pop();
int ii=x.i;
int jj=x.j;
if(vis[ii][jj])
continue;
vis[ii][jj]=true;
if(mp[ii][jj]==)
dr[ii][jj].push_back(x.pro);
x.pro.TIME++;
OVO y;
y=x;
y.i++;
if(y.i<=n)
{
if(mp[y.i][y.j]==)
{
P.push(y);
}
}
y=x;
y.i--;
if(y.i>)
{
if(mp[y.i][y.j]==)
{
P.push(y);
}
}
y=x;
y.j++;
if(y.j<=m)
{
if(mp[y.i][y.j]==)
{
P.push(y);
}
}
y=x;
y.j--;
if(y.j>)
{
if(mp[y.i][y.j]==)
{
P.push(y);
}
}
}
for(int ii=;ii<=n;ii++)
{
for(int jj=;jj<=m;jj++)
{
if(vis[ii][jj])
hvv[ii][jj]=true;
vis[ii][jj]=false;
}
}
}
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(!hvv[i][j]&&mp[i][j]==)
return true;
}
}
return false;
}
bool Bfs(void)
{
while(!Q.empty())Q.pop();
for(int i=;i<=t;i++)
p[i].lyr=;
p[s].lyr=;
Q.push(s);
while(!Q.empty())
{
int x=Q.front();
Q.pop();
for(int i=p[x].hd;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].lyr==&&e[i].vls>)
{
p[to].lyr=p[x].lyr+;
if(to==t)
return true;
Q.push(to);
}
}
}
return false;
}
int Dfs(int x,int fll)
{
if(x==t)
return fll;
for(int& i=p[x].now;i;i=e[i].lst)
{
int to=e[i].twd;
if(p[to].lyr==p[x].lyr+&&e[i].vls>)
{
int ans=Dfs(to,std::min(fll,e[i].vls));
if(ans>)
{
e[i].vls-=ans;
e[((i-)^)+].vls+=ans;
return ans;
}
}
}
return ;
}
int Dinic(void)
{
int ans=;
while(Bfs())
{
for(int i=;i<=t;i++)
p[i].now=p[i].hd;
int dlt;
while(dlt=Dfs(s,oo))
ans+=dlt;
}
return ans;
}
bool Check(int x)
{
for(int i=;i<=t;i++)
p[i].hd=;
cnt=;
int lcnt=n*m;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(mp[i][j]==)
{
T[no[i][j]].clear();
for(int k=;k<=x;k++)
T[no[i][j]].push_back(++lcnt);
}
s=lcnt+;
t=s+;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(mp[i][j]==)
{
ade(s,no[i][j],);
ade(no[i][j],s,);
for(int k=;k<dr[i][j].size();k++)
{
if(dr[i][j][k].TIME<=x)
{
ade(no[i][j],T[dr[i][j][k].NO][dr[i][j][k].TIME],);
ade(T[dr[i][j][k].NO][dr[i][j][k].TIME],no[i][j],);
}
}
}else if(mp[i][j]==)
{
for(int k=;k<=x;k++)
{
ade(T[no[i][j]][k],t,);
ade(t,T[no[i][j]][k],);
if(k!=x)
{
ade(T[no[i][j]][k],T[no[i][j]][k+],oo);
ade(T[no[i][j]][k+],T[no[i][j]][k],);
}
}
}
}
}
return pnum==Dinic();
}
int main()
{
// freopen("a.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%s",tmp+);
for(int j=;j<=m;j++)
{
no[i][j]=++cnt;
if(tmp[j]=='X')
mp[i][j]=;
if(tmp[j]=='.')
mp[i][j]=,
pnum++;
if(tmp[j]=='D')
mp[i][j]=;
}
}
cnt=;
if(bfs())
{
puts("impossible");
return ;
}
int l=,r=;
int ans;
while(l<=r)
{
int mid=(l+r)>>;
if(Check(mid))
{
ans=mid;
r=mid-;
}else
l=mid+;
}
printf("%d\n",ans);
return ;
}
BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)的更多相关文章
- BZOJ1189: [HNOI2007]紧急疏散evacuate 二分+最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 412[Submi ...
- 【BZOJ1189】紧急疏散(二分答案,最大流)
[BZOJ1189]紧急疏散(二分答案,最大流) 题面 Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是 ...
- Bzoj1189 [HNOI2007]紧急疏散evacuate
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 715 Descr ...
- bzoj千题计划132:bzoj1189: [HNOI2007]紧急疏散evacuate
http://www.lydsy.com/JudgeOnline/problem.php?id=1189 二分答案 源点向人连边,流量为1 门拆为mid个点,同一个门的第j个点向第j+1个点连边,流量 ...
- bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流
[HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3626 Solved: 1059[Submit][St ...
- 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate
[法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...
- 洛谷 P3191 [HNOI2007]紧急疏散EVACUATE(网络最大流)
题解 二分答案+Dinic最大流 二分答案\(mid\) 把门拆成\(mid\)个时间点的门 相邻时间的门连一条\(inf\)的边 预处理出每个门到每个人的最短时间 为\(dis[k][i][j]\) ...
- BZOJ1189:[HNOI2007]紧急疏散EVACUATE(最大流,枚举)
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- BZOJ1189 [HNOI2007]紧急疏散evacuate 【二分 + 网络流】
题目 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从 ...
随机推荐
- oracle 存储过程定义及调试,并终于被C# 调用 代码
C# 调用存储过程 參考了非常多文章,写了例如以下文字,算是分享吧 目的:更改积分,并作一定校验 一.一般的调试方法: 方法一:带返回out參数,必须定义变量 myresult DECLARE myr ...
- 里根上台时国债只占GDP的30%
学里根是刻舟求剑,关键是钱从哪来 5 里根主要靠借钱,这是冷战红利,美国打完二战国债占了GDP的120%,然后总量就没怎么增加,但战后GDP快速增长,结果国债占GDP的比例连续下降,打越战登月石油危 ...
- nj09---util、inherits、inspect、events、error
一.util全局变量 1.util.inherits(constructor,superConstructor) 此方法是一个实现对象间原型继承的函数.javaScript通过原型赋值来实现继承,细节 ...
- ELK搭建(filebeat、elasticsearch、logstash、kibana)
ELK部署(文章有点儿长,搭建时请到官网将tar包下载好,按步骤可以完成搭建使用) ELK指的是ElasticSearch.LogStash.Kibana三个开源工具 LogStash是负责数据的收集 ...
- rest_framework-解析器-总结完结篇
感谢alex和武老师 前戏: Djaogo对请求体只支持 application/x-www-form-urlencoded请求头以及name=alex&age=18的数据格式 django. ...
- android客户端向java服务端post发送json
android 端: private void HttpPostData() { try { HttpClient httpclient = new DefaultHttpClient( ...
- mybatis如何成功插入后获取自增长的id
使用mybatis向数据库中插入一条记录,如何获取成功插入记录的自增长id呢? 需要向xml配置中加上一下两个配置: <insert id="add" useGenerate ...
- 自动关闭Messbox
/// <summary> /// 自动关闭Messbox /// </summary> public class MessageBoxAutoClose { System.T ...
- Java调用Python遇到的一系列问题与解决方案
首先,百度了几个方法 1.用jython里的一个jar包,jython.jar,里面封装了一个专门调用Python的类, 但是不知道为什么我用Java一调用就报错,因此放弃. 2.用runtime ...
- 理解JavaScript Call()函数原理。
最近在做面试题的过程中偶然碰到关于call函数的问题.然后再百度上查了查.偶然看到一篇文章:JavaScript中的call.apply.bind深入理解 抛开其对call函数基本概念的介绍还有其他原 ...