AC日记——[HNOI2007]紧急疏散evacuate bzoj 1189
思路:
处理每个人到门的最短路;
然后二分答案;
s向人连边流量1;
人向门拆分后的点连边流量1(拆成400,前一个点连当前点流量INF);
然后门向t连边流量二分的答案;
如果最后流量等于人的个数,则true;
来,上代码:
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxm 3000001
#define INF 0x7fffffff const int dx[]={,-,,,};
const int dy[]={,,,,-}; int n,m,d[][],tot,s,t,quex[maxm],quey[maxm],qued[maxm];
int head[],cnt,deep[],E[maxm],V[maxm],F[maxm],size,iap; char map[][]; bool if_[][]; void bfs(int sx,int sy)
{
int h=,tail=;
memset(if_,false,sizeof(if_));
quex[]=sx,quey[]=sy,qued[]=,if_[sx][sy]=true;
while(h<tail)
{
int nowx=quex[h],nowy=quey[h],nowd=qued[h++];
for(int i=;i<=;i++)
{
int x=nowx+dx[i],y=nowy+dy[i],dd=nowd+;
if(x>&&x<=n&&y>&&y<=m&&map[x][y]=='.'&&!if_[x][y])
{
if_[x][y]=true,d[tot][(x-)*m+y]=dd;
quex[tail]=x,quey[tail]=y,qued[tail++]=dd;
}
}
}
} inline void edge_add(int u,int v,int f)
{
E[++cnt]=head[u],V[cnt]=v,F[cnt]=f,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,F[cnt]=,head[v]=cnt;
} bool BFS()
{
memset(deep,-,sizeof(deep));
deep[s]=;queue<int>que;que.push(s);
while(!que.empty())
{
int now=que.front();que.pop();
for(int i=head[now];i;i=E[i])
{
if(F[i]>&&deep[V[i]]<)
{
deep[V[i]]=deep[now]+;
if(V[i]==t) return true;
que.push(V[i]);
}
}
}
return false;
} int flowing(int now,int flow)
{
if(now==t||flow<=) return flow;
int oldflow=;
for(int i=head[now];i;i=E[i])
{
if(F[i]>&&deep[V[i]]==deep[now]+)
{
int pos=flowing(V[i],min(flow,F[i]));
flow-=pos,oldflow+=pos;
F[i]-=pos,F[i^]+=pos;
if(flow==) return oldflow;
}
}
if(oldflow==) deep[now]=-;
return oldflow;
} bool check(int k)
{
memset(head,,sizeof(head));cnt=;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(map[i][j]=='.') edge_add(s,(i-)*m+j,);
}
}
for(int i=;i<=tot;i++)
{
int kop=size*i+tot;
edge_add(size+i,t,k);
for(int j=;j<=k;j++)
{
if(j!=) edge_add(kop+j-,kop+j,INF);
edge_add(kop+j,size+i,);
}
for(int j=;j<=size;j++) if(d[i][j]<=k) edge_add(j,kop+d[i][j],);
}
int pos=;
while(BFS())
pos+=flowing(s,INF);
if(pos>=iap) return true;
else return false;
} int main()
{
scanf("%d%d",&n,&m);
memset(d,/,sizeof(d));
for(int i=;i<=n;i++) scanf("%s",map[i]+);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(map[i][j]=='D')
{
tot++;
bfs(i,j);
}
if(map[i][j]=='.') iap++;
}
}
t=,size=n*m;
int l=,r=size,ans=-;
while(l<=r)
{
int mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
if(ans==-) cout<<"impossible";
else cout<<ans;
return ;
}
AC日记——[HNOI2007]紧急疏散evacuate bzoj 1189的更多相关文章
- 1189: [HNOI2007]紧急疏散evacuate - BZOJ
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...
- BZOJ 1189: [HNOI2007]紧急疏散evacuate( BFS + 二分答案 + 匈牙利 )
我们可以BFS出每个出口到每个人的最短距离, 然后二分答案, 假设当前答案为m, 把一个出口拆成m个表示m个时间, 点u到出口v的距离为d, 那么u->v的[d, m]所有点连边, 然后跑匈牙利 ...
- bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流
[HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3626 Solved: 1059[Submit][St ...
- bzoj千题计划132:bzoj1189: [HNOI2007]紧急疏散evacuate
http://www.lydsy.com/JudgeOnline/problem.php?id=1189 二分答案 源点向人连边,流量为1 门拆为mid个点,同一个门的第j个点向第j+1个点连边,流量 ...
- Bzoj1189 [HNOI2007]紧急疏散evacuate
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2293 Solved: 715 Descr ...
- BZOJ1189: [HNOI2007]紧急疏散evacuate 二分+最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1132 Solved: 412[Submi ...
- [HNOI2007]紧急疏散EVACUATE (湖南2007年省选)
[HNOI2007]紧急疏散EVACUATE 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面 ...
- 【二分答案】【最大流】[HNOI2007]紧急疏散EVACUATE
[HNOI2007]紧急疏散EVACUATE 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面 ...
- 【BZOJ1189】[HNOI2007]紧急疏散evacuate 动态加边网络流
[BZOJ1189][HNOI2007]紧急疏散evacuate Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空 ...
随机推荐
- A1055 The World's Richest(25 分)
A1055 The World's Richest(25 分) Forbes magazine publishes every year its list of billionaires based ...
- 动态规划:HDU1059-Dividing(多重背包问题的二进制优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- netcfg.exe
netcfg.exe 编辑 本词条缺少信息栏.名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 目录 1 简介 2 可能出现问题 简介编辑 netcfg.exe是Kaspersky的 ...
- Java web学习总结
javaweb学习总结(十四)——JSP原理 孤傲苍狼 2014-07-24 09:38 阅读:46603 评论:37 JavaWeb学习总结(十三)——使用Session防止表单重复提交 孤 ...
- Core Java的那点事儿之ArrayList
Core Java的那点事儿之ArrayList 万丈高楼平地起,Java基础要拿起.今天就从我看的Core Java里找了些小基础点来分享一下. 首先隆重介绍一下专业级龙套演员---Employee ...
- 【Rotate Image】cpp
题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwis ...
- Python-S9-Day127-Scrapy爬虫框架2
01 今日内容概要 02 内容回顾:爬虫 03 内容回顾:并发和网络 04 Scrapy框架:起始请求定制 05 Scrapy框架:深度和优先级 06 Scrapy框架:内置代理 07 Scrapy框 ...
- [oldboy-django][4python面试]cookie和session比较
session定义(知乎网上) Session的数据不是储存在客户端上的,而是储存在服务器上的:而客户端使用Cookie储存一个服务器分配的客户端会话序号(Session ID),当客户端请求服务器时 ...
- [状态更新]MSE三个月快速复习计划,成功考上复旦软工
最后更新,6月21日收到录取通知书啦,感谢当初不曾放弃的自己: 更新一下状态: 3.3日 分数出来了,过了复试线. 最初写这篇博客的时候,是希望自己能够每天或者至少每周更新下自己的复习状态,这样能够确 ...
- Unity 脚本<2>
UnityEngine; using System.Collections; public class PlayerControl : MonoBehaviour { [HideInInspector ...