[HNOI2007]紧急疏散evacuate

思路:

  处理每个人到门的最短路;

  然后二分答案;

  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的更多相关文章

  1. 1189: [HNOI2007]紧急疏散evacuate - BZOJ

    Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...

  2. BZOJ 1189: [HNOI2007]紧急疏散evacuate( BFS + 二分答案 + 匈牙利 )

    我们可以BFS出每个出口到每个人的最短距离, 然后二分答案, 假设当前答案为m, 把一个出口拆成m个表示m个时间, 点u到出口v的距离为d, 那么u->v的[d, m]所有点连边, 然后跑匈牙利 ...

  3. bzoj 1189 [HNOI2007]紧急疏散evacuate 二分+网络流

    [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3626  Solved: 1059[Submit][St ...

  4. bzoj千题计划132:bzoj1189: [HNOI2007]紧急疏散evacuate

    http://www.lydsy.com/JudgeOnline/problem.php?id=1189 二分答案 源点向人连边,流量为1 门拆为mid个点,同一个门的第j个点向第j+1个点连边,流量 ...

  5. Bzoj1189 [HNOI2007]紧急疏散evacuate

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2293  Solved: 715 Descr ...

  6. BZOJ1189: [HNOI2007]紧急疏散evacuate 二分+最大流

    1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1132  Solved: 412[Submi ...

  7. [HNOI2007]紧急疏散EVACUATE (湖南2007年省选)

    [HNOI2007]紧急疏散EVACUATE 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面 ...

  8. 【二分答案】【最大流】[HNOI2007]紧急疏散EVACUATE

    [HNOI2007]紧急疏散EVACUATE 题目描述 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面 ...

  9. 【BZOJ1189】[HNOI2007]紧急疏散evacuate 动态加边网络流

    [BZOJ1189][HNOI2007]紧急疏散evacuate Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空 ...

随机推荐

  1. vscode添加Astyle

    1.安装astyle插件,在应用商城里面一键安装即可.2.下载astyle的bin文件,并添加到系统环境变量.3.打开vscode的settings.json,添加以下代码. { "edit ...

  2. 13,scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy ...

  3. HDU 3368 Reversi

    http://acm.hdu.edu.cn/showproblem.php?pid=3368 题意:模拟黑白棋,下一步黑手最大可以转化多少个白旗 分析:暴力 原先的思路是找到D然后遍历其八个方向,直到 ...

  4. Python 技巧(三)—— list 删除一个元素的三种做法

    我们以一个字符串为元素类型的 list 为例,进行列表元素的删除: >>> l = ['no surfing', 'flippers'] 1 法一:remove(val) >& ...

  5. _cdecl _stdcall

    __cdecl程序的压栈方式为C风格__stdcall为PASCAL风格 举个例子:(1)   C函数  Fun1(a,b,c)   函数调用时,参数压栈顺序为 c , b , a(2)   PASC ...

  6. [oldboy-django][4python面试]面试前需要熟练掌握的知识点(待更新)

    python基础 - 生成器 - 装饰器 - 迭代器 - 列表生成式 - 引用,传参 - 面向对象,继承 前端Html: - 词法分析 - 作用域 - 语法分析 - this - Jsonp mysq ...

  7. Eclipse的Web项目完成后怎么发布到Tomcat

    打开eclipse,在“Server Locations”处,可以看到默认的是“Use Workspace metadata”. 而我们选择“Use Tomcat installation”,使用to ...

  8. [NOI2009] 植物大战僵尸 [网络流]

    题面: 传送门 思路: 这道题明显可以看出来有依赖关系 那么根据依赖(保护)关系建图:如果a保护b则连边(a,b) 这样,首先所有在环上的植物都吃不到,被它们间接保护的也吃不到 把这些植物去除以后,剩 ...

  9. location.origin兼容

    if (!window.location.origin) { window.location.origin = window.location.protocol + "//" + ...

  10. autoprefixer小记

    autoprefixer配置 // var aPostcss = [require('autoprefixer')({ browsers: ['ios>=3','android>=2',' ...