终于忙完期末考试了,即将进入愉快的暑假(虽然暑假作业奇多,但好歹终于能有大量时间刷题了)

先把上次新一类最小割留下的一道题目A了复习一下;

题目看起来很复杂,实际上和bzoj2132是同一个类型的

用S集合表示放正能量,T集合表示放负能量(可自行参照上一篇文章)

只是有几个不同点:

  1. 有些点是已经确定为S或T集合中的点

  2. 选择点属于S或者属于T都是没有收益的

对于未知的问题我们要转化为已知的问题来求解

首先我们来处理2,考虑到割是我们所得不到的收益,

于是我们可以把每个点选择属于S或者属于T产生的收益都当做是个1,

也就是对于每个点i,连接s--->i, i--->t 容量为1;

最后ans=n*n*n(抵消我们之前强加的收益)+图中的边数-mincut;

下面就是1没有解决了,考虑到割是我们所得不到的收益,

所以,对于那些已经确定为S集合中的点(T集合同理),我们只要使

s--->i 容量为inf,也就让这条边一定不成为割边,那么就满足了这个点的确定性;

好了,即使是立体的,依然可以黑白染色划分二分图,所以其余实现细节类似bzoj2132,这里不加赘述。

 const inf=;
      dx:array[..] of integer=(-,,,,,);
      dy:array[..] of integer=(,,-,,,);
      dz:array[..] of integer=(,,,,-,);
type node=record
       next,flow,point:longint;
     end; var edge:array[..] of node;
    h,numh,p,cur,d,pre:array[..] of longint;
    num:array[..,..,..] of longint;
    t,len,i,j,n,k,x,y,z,m,ans,sum:longint;
    s:ansistring; 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,q,neck,tmp:longint;
  begin
    numh[]:=t+;
    for i:= to t do
      cur[i]:=p[i];
    u:=;
    sap:=;
    neck:=inf;
    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
          cur[u]:=i;
          pre[j]:=u;
          neck:=min(neck,edge[i].flow);
          u:=j;
          if u=t then
          begin
            while u<> do
            begin
              u:=pre[u];
              i:=cur[u];
              dec(edge[i].flow,neck);
              inc(edge[i xor ].flow,neck);
            end;
            sap:=sap+neck;
          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>) and (h[j]<tmp) then
          begin
            q:=i;
            tmp:=h[j];
          end;
          i:=edge[i].next;
        end;
        h[u]:=tmp+;
        inc(numh[h[u]]);
        cur[u]:=q;
        if u<> then
        begin
          u:=pre[u];
          neck:=d[u];
        end;
      end;
    end;
  end; begin
  len:=-;
  fillchar(p,sizeof(p),);
  readln(n);
  t:=n*n*n+;
  for i:= to n do
  begin
    for j:= to n do
    begin
      readln(s);
      for k:= to n do
      begin
        inc(m);
        num[i,j,k]:=m;
        if (s[k]='N') and ((i+j+k) mod =) or (s[k]='P') and ((i+j+k) mod =) then
        begin
          add(,m,inf);
          add(m,,);
          add(m,t,);
          add(t,m,);
        end
        else if (s[k]='N') and ((i+j+k) mod =) or (s[k]='P') and ((i+j+k) mod =) then
        begin
          add(m,t,inf);
          add(t,m,);
          add(,m,);
          add(m,,);
        end
        else if s[k]='?' then
        begin
          add(,m,);
          add(m,,);
          add(m,t,);
          add(t,m,);
        end;
      end;
    end;
    if i<>n then readln;
  end;
  for i:= to n do
    for j:= to n do
      for k:= to n do
        for m:= to do
        begin
          x:=i+dx[m];
          y:=j+dy[m];
          z:=k+dz[m];
          if num[x,y,z]> then
          begin
            add(num[i,j,k],num[x,y,z],);
            add(num[x,y,z],num[i,j,k],);
            inc(sum);
          end;
        end;
  sum:=sum div +n*n*n;
  writeln(sum-sap);
end.

bzoj1976的更多相关文章

  1. 【BZOJ1976】[BeiJing2010组队]能量魔方 Cube 最小割

    [BZOJ1976][BeiJing2010组队]能量魔方 Cube Description 小C 有一个能量魔方,这个魔方可神奇了,只要按照特定方式,放入不同的 能量水晶,就可以产生巨大的能量. 能 ...

  2. 【BZOJ-1976】能量魔方Cube 最小割 + 黑白染色

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 884  Solved: 307[Submi ...

  3. BZOJ1976: [BeiJing2010组队]能量魔方 Cube

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 832  Solved: 281[Submi ...

  4. 【BZOJ1976】能量魔方 [最小割]

    能量魔方 Time Limit: 10 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 小C 有一个能量魔方,这个魔方可神奇 ...

  5. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

  6. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

随机推荐

  1. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  2. OpenJudge/Poj 1004 Financial Management

    1.链接地址: http://poj.org/problem?id=1004 http://bailian.openjudge.cn/practice/1004 2.题目: 总时间限制: 1000ms ...

  3. 使用XmlPullParser对xml进行读取

    XML文件是一种标记性语言;在开发中经常在接口交互时被用作报文传输或者把自定义的类序列化为XML的形式存储到数据库.正因为XML文件这么常用,使用JAVA对XML文件进行读写操作是每一个开发人员必须掌 ...

  4. php 调用 webservice服务

    class data{ $a = 123; $b = 456; } //直接php的SoapClient类 $client = new SoapClient('http://xxx.com/xx.as ...

  5. 在Mac OS X中使用VIM开发STM32(1)

       本文原创于http://www.cnblogs.com/humaoxiao,非法转载者请自重!     在我先前的博文⎣在Mac OS X中搭建STM32开发环境⎤中,我们在Mac中DIY出了最 ...

  6. linux操作系统使用3G网卡

    几个月前,opensuse13.2出了,一直手痒痒,一有空装了一个.当时在学校,一直用着校园网,也好久没有使用3G网卡.回家的时候,办了个3G网卡,结果插电脑上没有反应,以前插上去,都会提示创建一个网 ...

  7. pycharm3.x 注册码

    PyCharm 3.0 注册码 PyCharm3 序列号 License Key 用户名:yueting3527 注册码: ===== LICENSE BEGIN ===== 93347-120420 ...

  8. 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题

    1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...

  9. 如何解决jenkins中shell脚本明明执行失败却不自行退出,且构建结果仍然显示success的问题??

    首先,需要明确shell命令执行结果$?为0或者非0仅能代表此执行语句是否顺利执行了,例如: 执行语句:adb connect 192.168.XX.XX 执行结果:unable to connect ...

  10. Linux系统架设支持自助开通Shado wsocks及VPN前端的教程

    程序实现:通过网页端注册,自助开通VPN帐号及Shadowsocks帐号.并可实现流量统计 系统要求 Debian 6 x64 纯净系统 by: Lop ①配置环境 apt-get updateapt ...