首先我们可以二分一个答案时间T,这样就将最优性问题

转化为了判定性问题。下面我们考虑对于已知的T的判定

对于矩阵中所有的空点bfs一次,得出来每个点到门的距离,

然后连接空点和每个能在t时间内到达的门一条边,容量为1,

之后连接源和每个空点一条边,容量为1,门连接汇边,容量为t。

判断最大流是否满流就好了。

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. type
  12.     rec                         =record
  13.         x, y                    :longint;
  14.     end;
  15.  
  16. var
  17.     n, m                        :longint;
  18.     pre, other, len, time       :array[..] of longint;
  19.     last                        :array[..] of longint;
  20.     l                           :longint;
  21.     que1                        :array[..] of rec;
  22.     dis                         :array[..,..] of longint;
  23.     go                          :array[..,..] of longint;
  24.     num                         :array[..,..] of longint;
  25.     source, sink                :longint;
  26.     sum                         :longint;
  27.     map                         :array[..,..] of char;
  28.     que, d                      :array[..] of longint;
  29.      
  30. function min(a,b:longint):longint;
  31. begin
  32.     if a>b then min:=b else min:=a;
  33. end;
  34.      
  35. procedure connect(a,b,c,d:longint);
  36. begin
  37.     inc(l);
  38.     pre[l]:=last[a];
  39.     last[a]:=l;
  40.     other[l]:=b;
  41.     len[l]:=c;
  42.     time[l]:=d;
  43. end;
  44.      
  45. procedure make(a,b:longint);
  46. var
  47.     h, t, curx, cury, nx, ny    :longint;
  48.     i, j                        :longint;
  49.     f                           :boolean;
  50.      
  51. begin
  52.     connect(source,num[a,b],,);
  53.     connect(num[a,b],source,,);
  54.     fillchar(dis,sizeof(dis),);
  55.     dis[a,b]:=; que1[].x:=a; que1[].y:=b;
  56.     h:=; t:=;
  57.     while h<t do
  58.     begin
  59.         inc(h);
  60.         curx:=que1[h].x; cury:=que1[h].y;
  61.         for i:= to do
  62.         begin
  63.             nx:=curx+go[,i]; ny:=cury+go[,i];
  64.             if (nx<) or (nx>n) or (ny<) or (ny>m) then continue;
  65.             if dis[nx,ny]<> then continue;
  66.             if map[nx,ny]='X' then continue;
  67.             inc(t);
  68.             que1[t].x:=nx; que1[t].y:=ny;
  69.             dis[nx,ny]:=dis[curx,cury]+;
  70.         end;
  71.     end;
  72.     f:=false;
  73.     for i:= to n do
  74.         for j:= to m do
  75.         if map[i,j]='D' then
  76.             if dis[i,j]<> then
  77.             begin
  78.                 f:=true;
  79.                 connect(num[a,b],num[i,j],,dis[i,j]-);
  80.                 connect(num[i,j],num[a,b],,dis[i,j]-);
  81.             end;
  82.     if not f then
  83.     begin
  84.         writeln('impossible');
  85.         halt;
  86.     end;
  87. end;
  88.      
  89. procedure init;
  90. var
  91.     i, j                        :longint;
  92. begin
  93.     go[,]:=-; go[,]:=; go[,]:=; go[,]:=-;
  94.     readln(n,m);
  95.     for i:= to n do
  96.     begin
  97.         for j:= to m do read(map[i,j]);
  98.         readln;
  99.     end;
  100.      
  101.     for i:= to n do
  102.         for j:= to m do num[i,j]:=(i-)*m+j;
  103.      
  104.     source:=*n*m+; sink:=source+;
  105.     l:=;
  106.     for i:= to n do
  107.         for j:= to m do
  108.             if map[i,j]='.' then
  109.             begin
  110.                 make(i,j);
  111.                 inc(sum);
  112.             end;
  113.              
  114.     for i:= to n do
  115.         for j:= to m do
  116.             if map[i,j]='D' then
  117.             begin
  118.                 connect(num[i,j],sink,,);
  119.                 connect(sink,num[i,j],,);
  120.             end;
  121. end;
  122.  
  123. function bfs(up:longint):boolean;
  124. var
  125.     q, p                        :longint;
  126.     h, t, cur                   :longint;
  127. begin
  128.     fillchar(d,sizeof(d),);
  129.     que[]:=source; h:=; t:=;
  130.     d[source]:=;
  131.     while h<t do
  132.     begin
  133.         inc(h);
  134.         cur:=que[h];
  135.         q:=last[cur];
  136.         while q<> do
  137.         begin
  138.             if (len[q]>) and (time[q]<=up) then
  139.             begin
  140.                 p:=other[q];
  141.                 if (d[p]=) then
  142.                 begin
  143.                     inc(t);
  144.                     que[t]:=p;
  145.                     d[p]:=d[cur]+;
  146.                     if p=sink then exit(true);
  147.                 end;
  148.             end;
  149.             q:=pre[q];
  150.         end;
  151.     end;
  152.     exit(false);
  153. end;
  154.  
  155. function dinic(x,flow,up:longint):longint;
  156. var
  157.     tmp, rest                   :longint;
  158.     q, p                        :longint;
  159. begin
  160.     rest:=flow;
  161.     if x=sink then exit(flow);
  162.     q:=last[x];
  163.     while q<> do
  164.     begin
  165.         p:=other[q];
  166.         if (len[q]>) and (time[q]<=up) and (rest>) and (d[x]=d[p]-) then
  167.         begin
  168.             tmp:=dinic(p,min(len[q],rest),up);
  169.             dec(rest,tmp);
  170.             dec(len[q],tmp);
  171.             inc(len[q xor ],tmp);
  172.         end;
  173.         q:=pre[q];
  174.     end;
  175.     exit(flow-rest);
  176. end;
  177.  
  178. function judge(mid:longint):boolean;
  179. var
  180.     q                           :longint;
  181.     tot                         :longint;
  182.     i                           :longint;
  183. begin
  184.     q:=last[sink];
  185.     while q<> do
  186.     begin
  187.         len[q]:=;
  188.         len[q xor ]:=mid;
  189.         q:=pre[q];
  190.     end;
  191.     tot:=;
  192.     while bfs(mid) do
  193.         tot:=tot+dinic(source,maxlongint,mid);
  194.     for i:= to l do if i mod = then
  195.     begin
  196.         inc(len[i],len[i xor ]);
  197.         len[i xor ]:=;
  198.     end;
  199.     if tot<sum then exit(false) else exit(true);
  200. end;
  201.  
  202. procedure main;
  203. var
  204.     l, r, mid, ans              :longint;
  205. begin
  206.     l:=; r:=;
  207.     while l<=r do
  208.     begin
  209.         mid:=(l+r) div ;
  210.         if judge(mid) then
  211.         begin
  212.             ans:=mid;
  213.             r:=mid-;
  214.         end else l:=mid+;
  215.     end;
  216.     writeln(ans);
  217. end;
  218.  
  219. begin
  220.     init;
  221.     main;
  222. end.

bzoj 1189 二分+最大流判定的更多相关文章

  1. bzoj 1305 二分+最大流判定|贪心

    首先我们二分一个答案mid,在判定是否能举办mid次,那么对于每个次我们可以用最大流根据是否满流(流量为n*mid)来判定,对于每个点我们拆成两个点,分别表示这个人要和他喜欢和不喜欢的人一起跳舞,那么 ...

  2. bzoj 1189 二分+最大流

    题目传送门 思路: 先预处理出每个人到每扇门的时间,用门作为起点进行bfs处理. 然后二分时间,假设时间为x,将每扇门拆成1到x,x个时间点,表示这扇门有几个时间点是可以出去的.对于一扇门,每个时间点 ...

  3. BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图

    这道逼题!感受到了数学对我的深深恶意(#‵′).... 1822: [JSOI2010]Frozen Nova 冷冻波 Time Limit: 10 Sec Memory Limit: 64 MB S ...

  4. BZOJ 1189 二分匹配 || 最大流

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

  5. uvalive 3231 Fair Share 公平分配问题 二分+最大流 右边最多流量的结点流量尽量少。

    /** 题目: uvalive 3231 Fair Share 公平分配问题 链接:https://vjudge.net/problem/UVALive-3231 题意:有m个任务,n个处理器,每个任 ...

  6. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  7. HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others)    ...

  8. HDU-3081-Marriage Match II 二分图匹配+并查集 OR 二分+最大流

    二分+最大流: 1 //题目大意:有编号为1~n的女生和1~n的男生配对 2 // 3 //首先输入m组,a,b表示编号为a的女生没有和编号为b的男生吵过架 4 // 5 //然后输入f组,c,d表示 ...

  9. hdu4560 不错的建图,二分最大流

    题意: 我是歌手 Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Subm ...

随机推荐

  1. vue中的重要特性

    一.vue中的自定义组件 html的代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  2. c# 如何获取项目的根目录

    c# 如何获取项目的根目录 编写程序的时候,经常需要用的项目根目录.自己总结如下 1.取得控制台应用程序的根目录方法     方法1.Environment.CurrentDirectory 取得或设 ...

  3. 网页打包安卓APP流程

    搭建环境过程: 1. 安装JDK. 参见http://www.cnblogs.com/Li-Cheng/p/4334985.html. 注:实质上到该网址上下载好JDK安装包,安装后添加一个环境变量: ...

  4. 关于MySQL建表

    规范一些常用字段. password:varchar name:varchar 时间存储全部存储时间戳,用bigint(20),拒绝使用 MySQL数据类型  mysql数据类型 含义 date 3字 ...

  5. 透过c的编程原则,来规范自己现在的一些编程习惯

    1.合理的使用注释 注释为:/*…………*/ 注释有以下几种情况: 1) 版本.版权声明. 2) 函数接口说明. 3) 重要的代码或者段落显示. 注释注意: 1) 注释是对代码的解释,不是对文档.注释 ...

  6. Android Activity生命周期以及Fragment生命周期的区别与分析

    Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() ...

  7. 高性能MySQL——第一章MySQL的架构与历史

    1.可以使用SHOW TABLE STATUS查询表的相关信息. 2.默认存储引擎是InnoDB,如果没有什么很特殊的要求,InnoDB引擎是我们最好的选择. 3.mysql的infobright引擎 ...

  8. 自适应游标共享技术01(Adaptive Cursor Sharing)

    什么是ACS(adaptiver cursor sharing) Oracle通过绑定变量技术解决了SQL语句硬解析过多的问题,降低了资源的争用.但是绑定变量在引入cursor sharing,增加了 ...

  9. 小心C语言的定义与声明

    小心C语言的定义与声明 转自360博客 注:为便于说明问题,文中提及的变量和函数都被简化. 一.起源 DBProxy在测试过程中,发现对其执行某步管理操作后,程序有时会崩溃,但不是每次都出现. 二.G ...

  10. 使用dom4j技术对xml文件的基本操作

    1.pojo类:Notice package com.green.notice.storage; import java.util.ArrayList; import java.util.List; ...