Description

发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域。每个格子如果是'.',那么表示这是一
块空地;如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一扇门,人们可以从这儿撤出房间。已知门
一定在房间的边界上,并且边界上不会有空地。最初,每块空地上都有一个人,在疏散的时候,每一秒钟每个人都
可以向上下左右四个方向移动一格,当然他也可以站着不动。疏散开始后,每块空地上就没有人数限制了(也就是
说每块空地可以同时站无数个人)。但是,由于门很窄,每一秒钟只能有一个人移动到门的位置,一旦移动到门的
位置,就表示他已经安全撤离了。现在的问题是:如果希望所有的人安全撤离,最短需要多少时间?或者告知根本
不可能。

Input

第一行是由空格隔开的一对正整数N与M,3<=N <=20,3<=M<=20,
以下N行M列描述一个N M的矩阵。其中的元素可为字符'.'、'X'和'D',且字符间无空格。

Output

只有一个整数K,表示让所有人安全撤离的最短时间,
如果不可能撤离,那么输出'impossible'(不包括引号)。

Sample Input

5 5
XXXXX
X...D
XX.XX
X..XX
XXDXX

Sample Output

3

Solution

$Update$:写假了,先别看了QwQ

这个题……有点像跳舞那个题emmmm……
答案肯定是满足单调性的,所以我们可以枚举
(可以和跳舞那个题一样二分,不过二分就要每次重新添加边,太麻烦)
先判断impossible,BFS判断就行。
建图:超级源点-人-门-超级汇点
枚举秒数,每一秒就在门和超级汇点间连一条容量1的边,意味着当前秒这个门可以多出一个人了
若某个人到某个门耗费的时间为当前秒数,就在人和门间连一条容量为1的边
之后跑一边最大流,若最大流为人数的话就说明人可以全跑出去了
PS每次跑最大流的时候之前的Ans不能清零emmm

Code

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define MAXM (100000+10)
#define MAXN (1010+10)
using namespace std;
struct node
{
int Flow;
int next;
int to;
}edge[MAXM*];
int Depth[MAXN],Q[MAXN];
int head[MAXN],num_edge;
int n,m,s,e=,d,INF;
int a[MAXN][MAXN];
int num[MAXN][MAXN];
int dis[MAXN][MAXN];
int PEOPLE[MAXN],P_sum;
int DOOR[MAXN],D_sum;
int dx[]={,,-,,},dy[]={,,,,-};
int q[][];
int Ans;
bool used[][];
char ch[]; void add(int u,int v,int l)
{
edge[++num_edge].to=v;
edge[num_edge].Flow=l;
edge[num_edge].next=head[u];
head[u]=num_edge;
} bool Bfs(int s,int e)
{
int Head=,Tail=;
memset(Depth,,sizeof(Depth));
Depth[s]=;
Q[]=s;
while (Head<Tail)
{
int x=Q[++Head];
for (int i=head[x];i!=;i=edge[i].next)
if (!Depth[edge[i].to] && edge[i].Flow>)
{
Depth[edge[i].to]=Depth[x]+;
Q[++Tail]=edge[i].to;
}
}
if (Depth[e]>) return true;
return false;
} int Dfs(int x,int low)
{
int Min,f=;
if (x==e || low==)
return low;
for (int i=head[x];i!=;i=edge[i].next)
if (edge[i].Flow> && Depth[edge[i].to]==Depth[x]+ && (Min=Dfs(edge[i].to , min(low,edge[i].Flow) )))
{
edge[i].Flow-=Min;
edge[((i-)^)+].Flow+=Min;
f+=Min;
low-=Min;
}
return f;
} int Dinic(int s,int e)
{
// int Ans=0;
while (Bfs(s,e))
Ans+=Dfs(s,0x7fffffff);
return Ans;
} void DISTANCE(int x,int y)
{
int Head=,Tail=;
memset(used,false,sizeof(used));
q[][]=x;
q[][]=y;
used[x][y]=true;
while (Head<Tail)
{
++Head;
for (int i=;i<=;++i)
{
int xx=q[Head][]+dx[i];
int yy=q[Head][]+dy[i];
if (!used[xx][yy] && a[xx][yy])
{
used[xx][yy]=true;
dis[num[x][y]][num[xx][yy]]=dis[num[x][y]][num[q[Head][]][q[Head][]]]+;
q[++Tail][]=xx;
q[Tail][]=yy;
}
}
}
} int main()
{
memset(&INF,0x7f,sizeof(INF));
int n,m,cnt=;
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i)
{
scanf("%s",ch);
for (int j=;j<=m;++j)
{
if (ch[j-]=='X')
continue;
num[i][j]=++cnt;
if (ch[j-]=='.')
{
a[i][j]=;
PEOPLE[++P_sum]=num[i][j];
}
else
{
a[i][j]=;
DOOR[++D_sum]=num[i][j];
}
}
}
for (int i=;i<=n;++i)
for (int j=;j<=m;++j)
if (a[i][j])
DISTANCE(i,j);
for (int i=;i<=P_sum;++i)
{
bool flag=false;
for (int j=;j<=D_sum;++j)
if (dis[PEOPLE[i]][DOOR[j]]!=)
{
flag=true;
break;
}
if (!flag)
{
printf("impossible\n");
return ;
}
}
for (int i=;i<=P_sum;++i)
{
add(,PEOPLE[i],);
add(PEOPLE[i],,);
}
for (int i=;i<=;++i)
{
for (int j=;j<=D_sum;++j)
{
add(DOOR[j],,);
add(,DOOR[j],);
}
for (int j=;j<=P_sum;++j)
for (int k=;k<=D_sum;++k)
if (dis[PEOPLE[j]][DOOR[k]]==i)
{
add(PEOPLE[j],DOOR[k],);
add(DOOR[k],PEOPLE[j],);
}
if (Dinic(,)==P_sum)
{
printf("%d",i);
return ;
}
}
}

BZOJ1189:[HNOI2007]紧急疏散EVACUATE(最大流,枚举)的更多相关文章

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

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

  2. Bzoj1189 [HNOI2007]紧急疏散evacuate

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

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

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

  4. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

  5. BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)

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

  6. BZOJ1189 [HNOI2007]紧急疏散evacuate 【二分 + 网络流】

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

  7. P3191 [HNOI2007]紧急疏散EVACUATE(费用流)

    P3191 [HNOI2007]紧急疏散EVACUATE 费用流+卡常优化 我们只关心一个人通过门时的时间,在空地的行走时间可以分层维护 于是根据时间分层,到门的时候再计算代价,即代价$=$层数 每经 ...

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

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

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

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

随机推荐

  1. CentOS7下SVN server的安装与配置

    CentOS7通过yum install命令进行安装SVN(参考:http://subversion.apache.org/packages.html#centos) $ yum install su ...

  2. hdu 1023 卡特兰数《 大数》java

    Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. POJ3087(KB1-G 简单搜索)

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10366   Accepted: 4800 Des ...

  4. CSS关于文本渲染的属性text-rendering

    CSS关于文本渲染的属性text-rendering告诉渲染引擎工作时如何优化显示文本. 浏览器会在渲染速度.易读性(清晰度)和几何精度方面做一个权衡. 我们知道,SVG-可缩放矢量图形(Scalab ...

  5. 第二十六天- C/S架构 通信流程 socket

    1.C/S架构 C/S架构:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可是物理层面)来划分的.这里客户端一般指需先安装再执行的应用程序,对操作系统依赖性较 ...

  6. FFmpeg实现将图片转换为视频

    ##名称:ffmpeg实现将图片转换为视频 ##平台:ubuntu(已经安装好了ffmpeg工具) ##日期:2017年12月10日 简介: 因为学习需要,需要将连续图片转换成视频,昨天和今天早上用o ...

  7. ArcGIS Server命令行工具学习笔记

    备份命令 backup.py 参数: -u 管理员账号 -p 密码 -s 站点URL -f 备份文件的存储目录路径 -h 显示帮助 还原命令 restore.py 参数: -u 管理员账号 -p 密码 ...

  8. 网络I/O模型--06异步I/O

    异步I/O (又称为 AIO )则是采用“订阅一通知”工作模式 : 即应用程序向操作系统注册I/O监听,然后继续做自己的事情.当操作系统发生I/O事件,并且准备好数据后 , 再主动通知应用程序,触发相 ...

  9. Django settings介绍

    """ Django settings for macboy project. Generated by 'django-admin startproject' usin ...

  10. wdcpV3面板安装ssl证书 apache教程 子站SSL配置

    本帖最后由 q1082121 于 2016-11-24 12:31 编辑 方案二 apache1.把apache类型的ssl三个文件上传到:/www/wdlinux//www/wdlinux/http ...