题做多的话不难想到可能是以行列作为二分图两个点集,然后网络流相关

具体怎么弄呢

我们可以用求补集的思想,假设有解

我们先把棋盘能放的地方放满士兵,然后我们尽量的把士兵拿走

并且要满足行和列的要求,

说到这方法就很明显了

ans=n*m-障碍数-最大流

我们用x[i]表示棋盘放满后第i行最多能移开的士兵数

y[i]表示棋盘放满后第i列最多能移开的士兵数

然后建图就更明显了,不多说

无解预先判断一下即可

 const inf=;
type node=record
       next,point,flow:longint;
     end; var edge:array[..] of node;
    he,li,cur,p,numh,pre,h,d:array[..] of longint;
    a:array[..,..] of boolean;
    k,i,j,n,m,x,y,len,t:longint; function min(a,b:longint):longint;
  begin
    if a>b then exit(b) else exit(a);
  end; procedure add(x,y,f:longint);
  begin
    inc(len);
    edge[len].point:=y;
    edge[len].flow:=f;
    edge[len].next:=p[x];
    p[x]:=len;
  end; function sap:longint;
  var u,i,j,neck,tmp,q:longint;
  begin
    neck:=inf;
    u:=;
    numh[]:=t+;
    h[]:=;
    sap:=;
    for i:= to t do
      cur[i]:=p[i];
    while h[]<t+ do
    begin
      d[u]:=neck;
      i:=cur[u];
      while i<>- do
      begin
        j:=edge[i].point;
        if (edge[i].flow>) and (h[u]=h[j]+) then
        begin
          neck:=min(neck,edge[i].flow);
          pre[j]:=u;
          cur[u]:=i;
          u:=j;
          if u=t then
          begin
            sap:=sap+neck;
            while u<> do
            begin
              u:=pre[u];
              j:=cur[u];
              dec(edge[j].flow,neck);
              inc(edge[j xor ].flow,neck);
            end;
            neck:=inf;
          end;
          break;
        end;
        i:=edge[i].next;
      end;
      if i=- then
      begin
        dec(numh[h[u]]);
        if numh[h[u]]= then exit;
        tmp:=t;
        i:=p[u];
        q:=-;
        while i<>- do
        begin
          j:=edge[i].point;
          if edge[i].flow> then
            if h[j]<tmp then
            begin
              tmp:=h[j];
              q:=i;
            end;
          i:=edge[i].next;
        end;
        h[u]:=tmp+;
        cur[u]:=q;
        inc(numh[h[u]]);
        if u<> then
        begin
          u:=pre[u];
          neck:=d[u];
        end;
      end;
    end;
  end; begin
  len:=-;
  fillchar(p,sizeof(p),);
  readln(n,m,k);
  t:=n+m+;
  for i:= to n do
    read(he[i]);
  for i:= to m do
    read(li[i]);
  for i:= to k do
  begin
    readln(x,y);
    a[x,y]:=true;
    inc(he[x]);
    inc(li[y]);
  end;
  for i:= to n do
  begin
    if he[i]>m then
    begin
      writeln('JIONG!');
      halt;
    end;
    add(,i,m-he[i]);
    add(i,,);
  end;
  for i:= to m do
  begin
    if li[i]>n then
    begin
      writeln('JIONG!');
      halt;
    end;
    add(i+n,t,n-li[i]);
    add(t,i+n,);
  end;
  for i:= to n do
    for j:= to m do
      if not a[i,j] then
      begin
        add(i,j+n,);
        add(j+n,i,);
      end;
  writeln(n*m-k-sap);
end.

bzoj1458的更多相关文章

  1. BZOJ1458 士兵占领 网络流 最大流 SAP

    原文链接http://www.cnblogs.com/zhouzhendong/p/8384699.html 题目传送门 - BZOJ1458 题意概括 有一个M * N的棋盘,有的格子是障碍.现在你 ...

  2. 【BZOJ1458】士兵占领 最小流

    [BZOJ1458]士兵占领 Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占 ...

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

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

  4. BZOJ1458 士兵占领 【带上下界网络流】

    题目链接 BZOJ1458 题解 对行列分别建边,拆点,设置流量下限 然后\(S\)向行连边\(inf\),列向\(T\)连边\(inf\),行列之间如果没有障碍,就连边\(1\) 然后跑最小可行流即 ...

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

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

  6. bzoj1458 士兵占领

    费用流,连下面几类边 1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵 2.s'->行 (1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵. (2) ...

  7. 【bzoj1458】士兵占领

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

  8. bzoj1458: 士兵占领 网络流

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1458 也可以去luogu 思路 想成倒着删去点,使得依旧满足覆盖!! 左边横,右边列,之间用 ...

  9. BZOJ1458:士兵占领(有上下界最小流)

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

随机推荐

  1. Ext.Net学习笔记11:Ext.Net GridPanel的用法

    Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...

  2. Google Android SDK开发范例------------20141119

    一.Edit和Checkbox完成对登陆密码的查看:添加Edit的setOnCheckedChageListener和对CheckBox的状态通过isCHecked判断 大体代码如下 CheckBox ...

  3. boa服务器问题日志

    1. 某一次在登录boa服务器的时候,不知哪里的问题,无法登录「192.168.1.0-192.168.3.255」网段的设备,但是公司IP网段的机器都可以用.最终发现,问题出现在自己的PC添加了浏览 ...

  4. 选择第n小的元素之python实现源码

    def partition(A, p, r): j = p+1 for i in range(p+1, r+1): if(A[i] < A[p]): tmp = A[i] A[i] = A[j] ...

  5. 【实习记】2014-08-29算法学习Boyer-Moore和最长公共子串(LCS)

        昨天的问题方案一:寻找hash函数,可行性极低.方案二:载入内存,维护成一个守护进程的服务.难度比较大.方案三:使用前5位来索引,由前3位增至前5位唯一性,理论上是分拆记录扩大100倍,但可以 ...

  6. java中运算符——进度1

    Class Demo1{    public static void main(String[] args) {        /*        一.逻辑运算法用于连接两个boolean类型的表达式 ...

  7. js 不可变的原始值和可变的对象引用

    javascript中的原始值(undefined.null.布尔值.数字和字符串)与对象(包括数组和函数)有着根本区别.原始值是不可更改的:任何方法都无法更改(或“突变”)一个原始值.对数字和布尔值 ...

  8. MySQL在远程访问时非常慢的解决skip-name-resolve 并且出现 Reading from net

    转载:http://www.itokit.com/2012/0515/73932.html 服务器放在局域网内进行测试时,数据库的访问速度还是很快.但当服务器放到外网后,数据库的访问速度就变得非常慢. ...

  9. linux重新增加硬盘容量

    1.先用df -h查看硬盘使用情况 2.fdisk -l查看分区情况 表示还没有挂载 3.fdisk /dev/vdb进行分区 4.mkfs.ext3 /dev/vdb进行格式化 5.mount /d ...

  10. QQ空间的“神奇”图片

    近几天好多朋友问我qq空间出现的神奇图片原理,最近比较烦,事情比较多,一直没理.加上我对PHP之类的语言也一知半解. 今天闲了看了一下QQ空间,发现这个很早以前就有人写过这样的帖子了 看别人解释 (转 ...