bzoj 1189

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1189

这道题目看起来好像要用很高端的网络流。

这道题有一个特别之处,就是每一个空地都有人,不是某些空地有人。

先二分时间mid,从源点S向空地连一条容量为1的边,空地向在时间mid内能到达的门连一条容量1的边,最后门向汇点T连一条容量为mid的边。

这样为什么是对的呢,能保证单位时间内只有一个人通过某个门吗?

我们来简单认识一下:

我们求到的最大流已经是满流了。

这时候有两个人a和b都去了门1,并且a和b去这个门的时间是一样的。

这好像是违反规定的。

但我们可以在a到门1的路上找一个人c,因为是满流,所以人c一定会有一个去处门2

我们可以换一下a去门2,c出门1,这样结果还是不变的。

这个说法好像比较粗略。。。。。。

时间: 2024-10-12 13:47:57

bzoj 1189的相关文章

BZOJ 1189 【HNOI2007】 紧急疏散evacuate

题目链接:紧急疏散 这薄脊题我代码不知不觉就写长了-- 这道题二分答案显然,然后用最大流\(check\)即可.设当前二分的答案为\(x\),那么把每扇门拆成\(x\)个点,第\(i\)个代表在第\(i\)个时刻从这个门走出去.然后把每个空地往可以到达的们的相应时间连边就可以了.判一下这张图是否满流即可. 然后我们就需要先求出每个空地到门的距离--注意途中不能经过另外的门,否则会被BZOJ上加强的数据给卡掉-- 下面贴代码: #include<iostream> #include<cst

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

我们可以BFS出每个出口到每个人的最短距离, 然后二分答案, 假设当前答案为m, 把一个出口拆成m个表示m个时间, 点u到出口v的距离为d, 那么u->v的[d, m]所有点连边, 然后跑匈牙利去check就行了...其实这道题挺好想但是码量还是挺大的.... ----------------------------------------------------------------------------- #include<cstdio> #include<cstring&

bzoj 1189 二分+最大流

题目传送门 思路: 先预处理出每个人到每扇门的时间,用门作为起点进行bfs处理. 然后二分时间,假设时间为x,将每扇门拆成1到x,x个时间点,表示这扇门有几个时间点是可以出去的.对于一扇门,每个时间点都向后一个时间点建边,表示人在当前时间点到达,可以在下一时间点出去. 先将s连上所有的空地,流量为1,建立每个空地每个门的对应的时间点流量为1的边,表示这个空地的人会再某一时间点到达这扇门.然后每个门流向t,流量为inf.只要最大流为空地的数量,则代表该时间是可以的,继续向下二分. #include

AC日记——[HNOI2007]紧急疏散evacuate bzoj 1189

[HNOI2007]紧急疏散evacuate 思路: 处理每个人到门的最短路: 然后二分答案: s向人连边流量1: 人向门拆分后的点连边流量1(拆成400,前一个点连当前点流量INF): 然后门向t连边流量二分的答案: 如果最后流量等于人的个数,则true: 来,上代码: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorit

BZOJ 1189 [HNOI2007]紧急疏散evacuate

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

BZOJ 1189 HNOI 2007 紧急疏散 evacuate 二分答案 最大流

题目大意:紧急疏散.有一张地图,'.'表示人,'D'表示门,人需要走曼哈顿距离的单位时间才1能到达门.一个门一个时刻只能通过一个人.求多长时间能疏散完毕. 思路:二分答案+最大流满流判定.先BFS处理出每个人与门的距离.二分最小时间,然后连边.S向每个人连流量为1的边,每个人向二分的时间之内能到达的门连流量为1的边.每个门向T连流量为t的边.然后最大流判定是否满流. (数组大小我是瞎开的,写代码的时候要算好了在开!) CODE: #include <queue> #include <cs

【BZOJ 1189】[HNOI2007]紧急疏散evacuate

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

BZOJ 1189 HNOI2007 紧急疏散evacuate 二分答案+最大流

题目大意:给定一个m*n的地图,每个点有可能是空地.墙或者出口,每个空地初始站着一个人,每一时刻可以向周围走1格,门每一时刻只能通过一个人,求最短多少时间后所有人可以撤离 首先从每个出口出发开始广搜,得到每个空地到所有出口的距离 然后二分答案,每次建图如下: 从源点向每个空地一条流量为1的边 如果一个空地能在规定时间到达某个出口,就从这个空地出发向该出口链接一条流量为1的边 每个出口向汇点连接一条流量为时间的边 然后跑最大流验证即可 注意图有不连通的情况 所以广搜要清初值(这个没人会忘吧QAQ

【BZOJ】1189: [HNOI2007]紧急疏散evacuate(二分+bfs+网络流)

http://www.lydsy.com/JudgeOnline/problem.php?id=1189 表示完全不会QAQ.... 于是膜拜题解orz 二分时间........... 于是转换成判定性问题:即如何在有限时间内通过. 假设当前有t时间可供通过...那么每一个门最多能通过t个人........ 然后将所有能够到达门的点连边,容量为无限.... 然后源向每个点可行点连边..容量1.. 然后每个门向汇连边..容量为t.. 然后判断即可.... (一开始bfs写错了啊QAQ.. #inc