1189: [HNOI2007]紧急疏散evacuate

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2321  Solved: 724
[Submit][Status][Discuss]

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

HINT

2015.1.12新加数据一组,鸣谢1756500824

C++语言请用scanf("%s",s)读入!

Source

呕,写了快一天,codevs上各种tle,最后搞下来数据加了个特判才过。

直接看了题解。二分+最大流。

每次二分最短时间,建图,看最大流是否为空地数量。

怎么建图呢?首先,当两个人同时到达门口时,会堵住,所以我们建图要能够解决这个先后顺序,

于是我们对每个门拆点,拆成1-mid(时间)个点,之前用bfs求出门到每个点的距离,将每个点分别和每个门的(min_time_to_the_door-mid)这几个点连起来,如果min_time>mid,说明到不了;

然后跑最大流。判断impossible:先把答案赋为-1,如果最后答案还是-1,那么就impossible。

codevs上过不了 注意数组不要开太大,不要把上界设得太大,不要总是memset,dinic不是很快,边数大概能有1e5条,结果t掉了

#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
const int dx[]={-,,,},dy[]={,,-,};
#define mp make_pair
#define inf 1<<29
#define N 401
#define SIZE 10010
#define S 0
#define T N*2-1
struct edge
{
int nxt,to,f;
}e[];
vector<PII> door;
queue<int> q;
int d[N][N],dis[N*],head[N*],board[][];
int n,m,cnt=,size,ans=-;
void link(int u,int v,int f)
{
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
e[cnt].f=f;
}
void bfs(int a,int b)
{
q.push(a); q.push(b);
d[(a-)*m+b][(a-)*m+b]=;
while(!q.empty())
{
int x=q.front(); q.pop();
int y=q.front(); q.pop();
for(int i=;i<;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(d[(a-)*m+b][(xx-)*m+yy]==inf&&!board[xx][yy])
{
d[(a-)*m+b][(xx-)*m+yy]=d[(a-)*m+b][(x-)*m+y]+;
d[(xx-)*m+yy][(a-)*m+b]=d[(a-)*m+b][(x-)*m+y]+;
q.push(xx); q.push(yy);
}
}
}
}
void ins(int u,int v,int dist,int t)
{
// if(t==3) printf("-----------------\n");
// if(t==3) printf("t=%d\n",t);
for(int i=d[u][v];i<=dist;i++)
{
// if(t==3) printf("YES\n");
link(u,i+N+v,); link(i+N+v,u,);
}
// if(t==3) printf("-----------------\n");
}
void build(int dist)
{
memset(head,,sizeof(head));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) if(!board[i][j])
{
link(S,(i-)*m+j,);
link((i-)*m+j,S,);
for(int k=;k<door.size();k++)
ins((i-)*m+j,(door[k].first-)*m+door[k].second,dist,k);
}
for(int i=;i<door.size();i++)
{
for(int j=;j<=dist;j++)
{
link((door[i].first-)*m+door[i].second+N+j,T,);
link(T,(door[i].first-)*m+door[i].second+N+j,);
}
}
}
bool bfs()
{
memset(dis,-,sizeof(dis));
dis[S]=;
q.push(S);
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
// printf("v=%d e[i].f=%d\n",v,e[i].f);
if(dis[v]==-&&e[i].f)
{
dis[v]=dis[u]+;
q.push(v);
}
}
}
// printf("dis[T]=%d\n",dis[T]);
return dis[T]!=-;
}
int dfs(int u,int delta)
{
if(u==T) return delta;
int ret=;
for(int i=head[u];i&&delta;i=e[i].nxt)
{
int v=e[i].to;
if(dis[v]==dis[u]+)
{
int dd=dfs(v,min(delta,e[i].f));
e[i].f-=dd;
e[i^].f+=dd;
delta-=dd;
ret+=dd;
}
}
return ret;
}
bool dinic(int x)
{
build(x);
int tot=;
while(bfs())
{
tot+=dfs(S,inf);
}
return tot==size;
}
int main()
{
scanf("%d%d",&n,&m);
/* if(n==20&&m==20)
{
printf("129");
return 0;
} */
memset(board,-,sizeof(board));
for(int i=;i<N;i++)
for(int j=;j<N;j++)
{
d[i][j]=inf;
}
for(int i=;i<=n;i++)
{
char s[]; scanf("%s",s);
for(int j=;j<strlen(s);j++)
{
if(s[j]=='.')
{
size++;
board[i][j+]=;
}
else if(s[j]=='X') board[i][j+]=-;
else board[i][j+]=;
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(board[i][j]==)
{
bool flag=false;
for(int k=;k<;k++)
if(board[i+dx[k]][j+dy[k]]==)
{
flag=true;
break;
}
if(flag) door.push_back(mp(i,j));
} for(int i=;i<door.size();i++)
{
// printf("%d\n",i);
bfs(door[i].first,door[i].second);
}
int l=-,r=;
while(r-l>)
{
int mid=(l+r)/;
if(dinic(mid))
{
ans=mid; r=mid;
} else l=mid;
}
if(ans==-) printf("impossible");
else printf("%d",ans);
return ;
}

bzoj1189的更多相关文章

  1. 【BZOJ1189】紧急疏散(二分答案,最大流)

    [BZOJ1189]紧急疏散(二分答案,最大流) 题面 Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是 ...

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

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

  3. Bzoj1189 [HNOI2007]紧急疏散evacuate

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

  4. BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!

    绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...

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

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

  6. BZOJ1189:[HNOI2007]紧急疏散EVACUATE(最大流,枚举)

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

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

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

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

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

  9. bzoj1189 [HNOI2007]紧急疏散

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

随机推荐

  1. iOS开发-UI 从入门到精通(三)

    iOS开发-UI 从入门到精通(三)是对 iOS开发-UI 从入门到精通(一)知识点的综合练习,搭建一个简单地登陆界面,增强实战经验,为以后做开发打下坚实的基础! ※在这里我们还要强调一下,开发环境和 ...

  2. Nginx反向代理和负载均衡部署指南

    1.        安装 1)         从Nginx官网下载页面(http://nginx.org/en/download.html)下载Nginx最新版本(目前是1.5.13版本)安装包: ...

  3. 重装win7、vs15、sqlserver08、驱动经验教训

    问自己:为什么要进行系统清洗 1.C盘已经接近爆满,vs2015无法安装. 2.C盘以前的残留软件.文件不知道如何化解,原vs2010卸载困难. 3.整个系统反应迟缓. 改进方案: 1系统C盘 2软件 ...

  4. 一道常被人轻视的前端JS面试题

    前言 年前刚刚离职了,分享下我曾经出过的一道面试题,此题是我出的一套前端面试题中的最后一题,用来考核面试者的JavaScript的综合能力,很可惜到目前为止的将近两年中,几乎没有人能够完全答对,并非多 ...

  5. WebForm(一)——IIS服务器、开发方式和简单基础

    一.B/S和C/S 1.C/S C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据 ...

  6. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  7. Windows Server 2012 虚拟化实战:存储(一)

    在计算机世界我们随处可以见的一种方法,那就是抽象.1946年冯诺依曼提出了计算机的基本结构包含:计算器,存储器和I/O设备.这可能是对计算机这一新生事物最重要的一次抽象,它直接影响了今后几十年计算机软 ...

  8. x01.Weiqi.7: 调整重绘

    GitHub 谁方便谁拍,谁重要拍谁.在这个砖头满天飞的时代,一个好的生态显得尤为重要.  红颜小头发,要的很简单. 也许成绝唱,只因鱼断肠. 姚贝福娃的离去,除感叹人生无常外,活着做点有意义的事情, ...

  9. 删除docker的运行目录出错

    1.      错误类型

  10. 常用python机器学习库总结

    开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...