Problem
【HNOI2007】紧急疏散evacuate
Description
发生了火警,所有人员需要紧急疏散!假设每个房间是一个的矩形区域。每个格子如果是’’,那么表示这是一块空地;如果是’’,那么表示这是一面墙,如果是’’,那么表示这是一扇门,人们可以从这儿撤出房间。已知门一定在房间的边界上,并且边界上不会有空地。最初,每块空地上都有一个人,在疏散的时候,每一秒钟每个人都可以向上下左右四个方向移动一格,当然他也可以站着不动。疏散开始后,每块空地上就没有人数限制了(也就是说每块空地可以同时站无数个人)。但是,由于门很窄,每一秒钟只能有一个人移动到门的位置,一旦移动到门的位置,就表示他已经安全撤离了。现在的问题是:如果希望所有的人安全撤离,最短需要多少时间?或者告知根本不可能。
Input
输入文件第一行是由空格隔开的一对正整数与,,,以下行列描述一个的矩阵。其中的元素可为字符’’, ‘’和’’,且字符间无空格。
Output
只有一个整数K,表示让所有人安全撤离的最短时间,如果不可能撤离,那么输出’’(不包括引号)。
Sample Input
1 | 5 5 |
Sample Output
1 | 3 |
HINT
2015.1.12新加数据一组,鸣谢1756500824
语言请用scanf("%s",s)
读入!
标签:二分答案
网络流
Solution
这题真坑逼,调了两小时。坑点已用红色加粗。
首先我们可以很容易地想到需要以每个门为起点,记录每个点到每个门的距离是多少。然后二分答案,对于当前答案,建图如下:
从源点向每个有人的点连容量为的边,从每个门向汇点连容量为的边。然后对于每个人,枚举每个门,如果这个人到某个门的距离小于等于,那么这个人一定会在时限内到达这个门前,所以我们从这个人向这个门连一条容量为的边。跑一遍最大流,如果流量等于人数,则可行。
写出来就是这样:
1 |
|
然而掉了。
原因很简单:某位神犇出了一组数据:
1 | 4 5 |
然而用刚刚的方法做答案是。
这是因为和都在时刻到达的门前,两个人分别过需要多一秒钟。
~
这里我们需要另一种建模方式:
首先源点向所有人连容量为的边,然后把每个门拆成个点,如果某人到某门的时间为,则从这个人向这个人的第到个点都连容量为的边。最后把每个门的个点向汇点连容量为的边即可。
Code
1 |
|