bzoj 1189 二分+最大流判定
首先我们可以二分一个答案时间T,这样就将最优性问题
转化为了判定性问题。下面我们考虑对于已知的T的判定
对于矩阵中所有的空点bfs一次,得出来每个点到门的距离,
然后连接空点和每个能在t时间内到达的门一条边,容量为1,
之后连接源和每个空点一条边,容量为1,门连接汇边,容量为t。
判断最大流是否满流就好了。
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
type
rec =record
x, y :longint;
end;
var
n, m :longint;
pre, other, len, time :array[..] of longint;
last :array[..] of longint;
l :longint;
que1 :array[..] of rec;
dis :array[..,..] of longint;
go :array[..,..] of longint;
num :array[..,..] of longint;
source, sink :longint;
sum :longint;
map :array[..,..] of char;
que, d :array[..] of longint;
function min(a,b:longint):longint;
begin
if a>b then min:=b else min:=a;
end;
procedure connect(a,b,c,d:longint);
begin
inc(l);
pre[l]:=last[a];
last[a]:=l;
other[l]:=b;
len[l]:=c;
time[l]:=d;
end;
procedure make(a,b:longint);
var
h, t, curx, cury, nx, ny :longint;
i, j :longint;
f :boolean;
begin
connect(source,num[a,b],,);
connect(num[a,b],source,,);
fillchar(dis,sizeof(dis),);
dis[a,b]:=; que1[].x:=a; que1[].y:=b;
h:=; t:=;
while h<t do
begin
inc(h);
curx:=que1[h].x; cury:=que1[h].y;
for i:= to do
begin
nx:=curx+go[,i]; ny:=cury+go[,i];
if (nx<) or (nx>n) or (ny<) or (ny>m) then continue;
if dis[nx,ny]<> then continue;
if map[nx,ny]='X' then continue;
inc(t);
que1[t].x:=nx; que1[t].y:=ny;
dis[nx,ny]:=dis[curx,cury]+;
end;
end;
f:=false;
for i:= to n do
for j:= to m do
if map[i,j]='D' then
if dis[i,j]<> then
begin
f:=true;
connect(num[a,b],num[i,j],,dis[i,j]-);
connect(num[i,j],num[a,b],,dis[i,j]-);
end;
if not f then
begin
writeln('impossible');
halt;
end;
end;
procedure init;
var
i, j :longint;
begin
go[,]:=-; go[,]:=; go[,]:=; go[,]:=-;
readln(n,m);
for i:= to n do
begin
for j:= to m do read(map[i,j]);
readln;
end;
for i:= to n do
for j:= to m do num[i,j]:=(i-)*m+j;
source:=*n*m+; sink:=source+;
l:=;
for i:= to n do
for j:= to m do
if map[i,j]='.' then
begin
make(i,j);
inc(sum);
end;
for i:= to n do
for j:= to m do
if map[i,j]='D' then
begin
connect(num[i,j],sink,,);
connect(sink,num[i,j],,);
end;
end;
function bfs(up:longint):boolean;
var
q, p :longint;
h, t, cur :longint;
begin
fillchar(d,sizeof(d),);
que[]:=source; h:=; t:=;
d[source]:=;
while h<t do
begin
inc(h);
cur:=que[h];
q:=last[cur];
while q<> do
begin
if (len[q]>) and (time[q]<=up) then
begin
p:=other[q];
if (d[p]=) then
begin
inc(t);
que[t]:=p;
d[p]:=d[cur]+;
if p=sink then exit(true);
end;
end;
q:=pre[q];
end;
end;
exit(false);
end;
function dinic(x,flow,up:longint):longint;
var
tmp, rest :longint;
q, p :longint;
begin
rest:=flow;
if x=sink then exit(flow);
q:=last[x];
while q<> do
begin
p:=other[q];
if (len[q]>) and (time[q]<=up) and (rest>) and (d[x]=d[p]-) then
begin
tmp:=dinic(p,min(len[q],rest),up);
dec(rest,tmp);
dec(len[q],tmp);
inc(len[q xor ],tmp);
end;
q:=pre[q];
end;
exit(flow-rest);
end;
function judge(mid:longint):boolean;
var
q :longint;
tot :longint;
i :longint;
begin
q:=last[sink];
while q<> do
begin
len[q]:=;
len[q xor ]:=mid;
q:=pre[q];
end;
tot:=;
while bfs(mid) do
tot:=tot+dinic(source,maxlongint,mid);
for i:= to l do if i mod = then
begin
inc(len[i],len[i xor ]);
len[i xor ]:=;
end;
if tot<sum then exit(false) else exit(true);
end;
procedure main;
var
l, r, mid, ans :longint;
begin
l:=; r:=;
while l<=r do
begin
mid:=(l+r) div ;
if judge(mid) then
begin
ans:=mid;
r:=mid-;
end else l:=mid+;
end;
writeln(ans);
end;
begin
init;
main;
end.
bzoj 1189 二分+最大流判定的更多相关文章
- bzoj 1305 二分+最大流判定|贪心
首先我们二分一个答案mid,在判定是否能举办mid次,那么对于每个次我们可以用最大流根据是否满流(流量为n*mid)来判定,对于每个点我们拆成两个点,分别表示这个人要和他喜欢和不喜欢的人一起跳舞,那么 ...
- bzoj 1189 二分+最大流
题目传送门 思路: 先预处理出每个人到每扇门的时间,用门作为起点进行bfs处理. 然后二分时间,假设时间为x,将每扇门拆成1到x,x个时间点,表示这扇门有几个时间点是可以出去的.对于一扇门,每个时间点 ...
- BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...
- BZOJ 1189 二分匹配 || 最大流
1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1155 Solved: 420[Submi ...
- uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。
/** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...
- poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点
题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...
- HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流
题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others) ...
- HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流
二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...
- hdu4560 不错的建图,二分最大流
题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...
随机推荐
- Data Being Added Conflicts with Existing Data
While developing a page with multiple scrolls levels, and especially when using a grid, you may get ...
- 10)Java Error and Exception
1>异常继承类 Error类和Exception类都继续自Throwable类 Error表示系统级的错误情况,如内存错误这样程序无法通过自身的处理再继续执行下去的情 ...
- WIN10系统 Solidworks 2015 Toolbox插件提示 failed to create toolboxl ibrary object 解决方法
网上大部分都是说卸载一个更新程序,但是在WIN10中根本没有. 但是也可通过以下方法解决: 1.关闭SW程序及进程,用管理员命令打开CMD 2.打开并复制SW目录,默认为 C:\Program Fil ...
- PHP实例 表单数据插入数据库及数据提取 用户注册验证
网站在进行新用户注册时,都会将用户的注册信息存入数据库中,需要的时候再进行提取.今天写了一个简单的实例. 主要完成以下几点功能: (1)用户进行注册,实现密码重复确认,验证码校对功能. (2)注册成功 ...
- 一元三次方程 (codevs 1038)题解
[问题描述] 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
- C#发送邮件源码
介绍 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.SMTP协议属于TCP/IP协议 ...
- MySQL线上执行大事务或锁表操作
前提 在线执行一些大事务或锁表操作(给某个核心级表加一列或者执行修改操作),此时不但主库从库要长时间锁表,主从延迟也会变大.未避免大事务sql对整个集群产生影响,,我们希望一条SQL语句只在Maste ...
- Keil(MDK-ARM)使用教程(二)_菜单
Ⅰ.概述 接着上一篇来总结Keil(MDK-ARM)菜单相关的内容,详情请往下看. 关于Keil的下载.安装和新建工程我已将在前面做了详细的总结,不懂的可以参考我博客里面相关的文章.该文章是在新建好工 ...
- openSUSE13.1安装搜狗输入法 for Linux
一句话总结:爽死我了!什么叫输入的快感终于体会到了,搜狗输入法,码农的好伙伴!!! 转自openSUSE论坛 女王陛下 https://forum.suse.org.cn/viewtopic.php? ...
- webpack 学习笔记 01 使用webpack的原因
本系列文章实际上就是官网文档的翻译加上自己实践过程中的理解. 伴随着websites演化至web apps的过程,有三个现象是很明显的: 页面中有越来越多的Js. 客户端能做的事情越来越多. 越来越少 ...