Description

有一个M * N的棋盘,有的格子是障碍。现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵。我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵, 第j列至少放置了Cj个士兵。现在你的任务是要求使用最少个数的士兵来占领整个棋盘。
Input

第一行两个数M, N, K分别表示棋盘的行数,列数以及士兵的个数。 第二行有M个数表示Li。 第三行有N个数表示Ci。 接下来有K行,每行两个数X, Y表示(X, Y)这个格子是障碍。
Output

输出一个数表示最少需要使用的士兵个数。如果无论放置多少个士兵都没有办法占领整个棋盘,输出”JIONG!” (不含引号)
Sample Input

4 4 4

1 1 1 1

0 1 0 3

1 4

2 2

3 3

4 3

Sample Output

4

数据范围

M, N <= 100, 0 <= K <= M * N

看数据范围,应该可以用网络流吧,但是他要最小化,于是我们就机智地转换成先填满然后最大限度的拿掉士兵就行了

每一列建一个点,每一行建一个点,能拿掉的士兵就从对应的行向列连一条容量为1的边,行和列加上容量限制(就是最多可以拿掉多少)

  1. const
  2. maxn=;
  3. var
  4. map:array[..maxn*,..maxn*]of longint;
  5. dis,his,vh,pre:array[..maxn*]of longint;
  6. n,m,k,s,t,flow:longint;
  7.  
  8. procedure init;
  9. var
  10. i,j,x,y:longint;
  11. begin
  12. read(n,m,k);
  13. s:=;
  14. t:=n+m+;
  15. for i:= to n do
  16. begin
  17. read(map[s,i]);
  18. map[s,i]:=m-map[s,i];
  19. end;
  20. for i:= to m do
  21. begin
  22. read(map[i+n,t]);
  23. map[i+n,t]:=n-map[i+n,t];
  24. end;
  25. for i:= to n do
  26. for j:= to m do
  27. map[i,j+n]:=;
  28. for i:= to k do
  29. begin
  30. read(x,y);
  31. dec(map[x,y+n]);
  32. dec(map[s,x]);
  33. dec(map[y+n,t]);
  34. if (map[s,x]<) or (map[y+n,t]<) then
  35. begin
  36. writeln('JIONG!');
  37. halt;
  38. end;
  39. end;
  40. end;
  41.  
  42. procedure sap;
  43. var
  44. i,j,min,aug:longint;
  45. flag:boolean;
  46. begin
  47. vh[]:=t+;
  48. aug:=maxlongint;
  49. i:=;
  50. while dis[i]<=t do
  51. begin
  52. his[i]:=aug;
  53. flag:=false;
  54. for j:= to t do
  55. if (dis[j]+=dis[i]) and (map[i,j]>) then
  56. begin
  57. flag:=true;
  58. if aug>map[i,j] then aug:=map[i,j];
  59. pre[j]:=i;
  60. i:=j;
  61. if i=t then
  62. begin
  63. inc(flow,aug);
  64. while i<>s do
  65. begin
  66. inc(map[i,pre[i]],aug);
  67. dec(map[pre[i],i],aug);
  68. i:=pre[i];
  69. end;
  70. aug:=maxlongint;
  71. end;
  72. break;
  73. end;
  74. if flag then continue;
  75. min:=t;
  76. for j:= to t do
  77. if (map[i,j]>) and (dis[j]<min) then min:=dis[j];
  78. dec(vh[dis[i]]);
  79. if vh[dis[i]]= then break;
  80. dis[i]:=min+;
  81. inc(vh[min+]);
  82. if i<>s then
  83. begin
  84. i:=pre[i];
  85. aug:=his[i];
  86. end;
  87. end;
  88. writeln(n*m-k-flow);
  89. end;
  90.  
  91. begin
  92. init;
  93. sap;
  94. end.

1458: 士兵占领 - BZOJ的更多相关文章

  1. BZOJ 1458: 士兵占领( 网络流 )

    先判无解 把整个棋盘都放上士兵, 只需求最多可以拿走多少个士兵即可.每一行看做一个点r(i), 每一列看做一个点c(i) S->r(i), c(i)->T 连边, 容量为可以拿走的最大士兵 ...

  2. bzoj 1458: 士兵占领 -- 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MB Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵 ...

  3. 【BZOJ】1458: 士兵占领(上下界网络流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1458 是不是我脑洞太小了.......直接弄上下界最小流........(就当复习了.. 二分图X和 ...

  4. 【刷题】BZOJ 1458 士兵占领

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

  5. BZOJ 1458 士兵占领

    http://www.lydsy.com/JudgeOnline/problem.php?id=1458 题意:n x m的棋盘,k个位置不能放,每行和每列都有要求至少的士兵,求能否有最少的满足条件的 ...

  6. bzoj 1458 士兵占领(最大流)

    [题意] n行m列,第i行必须放L[i],第j列必须放C[j],有障碍格,求满足条件至少需要放多少. [思路] 至少放多少等价于最多不放多少. 对行列分别建XY点,则连边(S,Xi,a)(Yi,T,b ...

  7. 【BZOJ-1458】士兵占领 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 782  Solved: 456[Submit][Status][Discuss] ...

  8. 【BZOJ1458】【洛谷4311】士兵占领(网络流)

    [BZOJ1458][洛谷4311]士兵占领(网络流) 题面 BZOJ权限题,洛谷真好 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最 ...

  9. 【bzoj1458】士兵占领

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

随机推荐

  1. MVC4 使用 ckfinder+ckeditor编辑器

    配置ckfinder for asp.net 版本下载地址  http://cksource.com/ckfinder/downloadckeditor下载地址 http://ckeditor.com ...

  2. 使用SSIS创建同步数据库数据任务

    国外相关的文章:http://blog.dxuf.com/sql-tutorial/use-ssis-to-create-the-synchronization-database-data-task. ...

  3. MSSQL数据库逻辑文件名修改与查看

    逻辑文件名是什么 你用的程序连接的时候使用的是数据库名,然后你在你的数据库右击属性的时候,左上角单击"文件",可以看到,数据库名和逻辑文件名是不一样的,你可以看自己的数据库的路径下 ...

  4. UI3_UIView自动布局

    // // ViewController.m // UI3_UIView自动布局 // // Created by zhangxueming on 15/7/1. // Copyright (c) 2 ...

  5. Stack Overflow 2016最新架构探秘

    这篇文章主要揭秘 Stack Overflow 截止到 2016 年的技术架构. 首先给出一个直观的数据,让大家有个初步的印象. 相比于 2013 年 11 月,Stack Overflow 在 20 ...

  6. asp.net visio com接口 asp.net和visio混合编程

    主要介绍asp.net调用visio com的基本用法,主要用于控制visio图形背景色,文字显示等. 主要步骤: 1. 项目中引用COM组件,找到Mircosoft Visio 14 Type Li ...

  7. struts2的包和命名空间

    struts2提供了命名空间的功能,主要是为了处理同一个WEB应用中包含同名Action的情形.struts2以命名空间的方式来管理Action,同一个命名空间里不能有同名的Action,不同的命名空 ...

  8. c++ string 拼接 int错误

    程序中用到字符串和int合成字符串,受java习惯的影响,直接进行了字符串与int的+操作,结果不正确.查了一下才明白问题所在,记录一下string str=”abc”+1;输出为:bc,因为”abc ...

  9. Source Insight建工程之Kernel

     不管你是从事于Linux内核工作还是出于兴趣爱好,Linux内核源码都是非常好的学习资源.意味着就要经常的和内核源码大交道,那么软件工具就是少不了的.在Windows系统上确实有着许多好用的软件 ...

  10. Ping N个IP测试网络连通性

    #-----------------------Smokeping移动节点-------------------##! /bin/bashecho "------------- Statin ...