题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1976

题意:给出一个n*n*n的立方体。每个小单位为字母P或者字母N。相邻两个小单位字母不同则总价值加1。现在有些小单位的字母已经确定,合理安排其他小单位的字母使得总价值最大?

思路:显然,若所有小单位都未确定,则进 行黑白染色即PN相间的安排时价值最大。基于这样的考虑,我们将所有小单位分成黑白两种颜色,设为A和B。显然同一种颜色之间是不会相邻的。设S集合为A 集合中的P(就是已经给出的)和B集合中的N,T集合为A集合中的N和B集合中的P,并且与ST的流量为INF。然后相邻的小单位之间连边,并记录边的数 量ans,那么ans减去最小割即是答案。为什么呢?显然,若原来给出的没有一个NP,则最小割为0,那么答案就是边的数量。有了一些NP,那么割边不会 是与ST的连边(因为这些边流量为INF),因此割边就是原来相邻小单位的边,而割到了这些边就相当于是这两个小单位染色相同,因此答案减去1,也就是每 有一个这样的割边答案就减去1。因此减去所有割就是答案。最小割决定答案最大。

struct node
{
    int v,cap,next;
};

node edges[N];
int head[N],e;

void add(int u,int v,int cap)
{
    edges[e].v=v;
    edges[e].cap=cap;
    edges[e].next=head[u];
    head[u]=e++;
}

void Add(int u,int v,int cap)
{
    add(u,v,cap);
    add(v,u,0);
}

int pre[N],cur[N],num[N],h[N];

int Maxflow(int s,int t,int n)
{
    int i;
    for(i=0;i<=n;i++) cur[i]=head[i],num[i]=h[i]=0;
    int u=s,Min,k,v;
    int ans=0;
    while(h[u]<n)
    {
        if(u==t)
        {
            Min=INF;
            for(i=s;i!=t;i=edges[cur[i]].v)
            {
                k=cur[i];
                if(edges[k].cap<Min) Min=edges[k].cap,v=i;
            }
            ans+=Min; u=v;
            for(i=s;i!=t;i=edges[cur[i]].v)
            {
                k=cur[i];
                edges[k].cap-=Min;
                edges[k^1].cap+=Min;
            }
        }
        for(i=cur[u];i!=-1;i=edges[i].next)
        {
            if(edges[i].cap>0&&h[u]==h[edges[i].v]+1) break;
        }
        if(i!=-1)
        {
            cur[u]=i;
            pre[edges[i].v]=u;
            u=edges[i].v;
        }
        else
        {
            if(--num[h[u]]==0) break;
            k=n;
            cur[u]=head[u];
            for(i=head[u];i!=-1;i=edges[i].next)
            {
                if(edges[i].cap>0&&h[edges[i].v]<k)
                {
                    k=h[edges[i].v];
                }
            }
            num[k+1]++;
            h[u]=k+1;
            if(u!=s) u=pre[u];
        }
    }
    return ans;
}

int n,m,a[45][45][45];
int dx[]={1,0,0,-1,0,0};
int dy[]={0,1,0,0,-1,0};
int dz[]={0,0,1,0,0,-1};
char s[45][45][45];

int ok(int x)
{
    return x&1;
}

int main()
{
    RD(n);
    int i,j,k,r=0;
    FOR1(i,n) FOR1(j,n) FOR1(k,n) a[i][j][k]=++r;
    int S=0,T=n*n*n+1;
    clr(head,-1);
    int x,y,z,ans=0;
    FOR1(i,n) FOR1(j,n) RD(s[i][j]+1);
    FOR1(i,n) FOR1(j,n) FOR1(k,n)
    {
        FOR0(r,6)
        {
            x=i+dx[r];
            y=j+dy[r];
            z=k+dz[r];
            if(x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n)
            {
                ans++;
                Add(a[i][j][k],a[x][y][z],1);
            }
        }
        if(s[i][j][k]!='?')
        {
            if(ok(i+j+k)&&s[i][j][k]=='P'||!ok(i+j+k)&&s[i][j][k]=='N')
            {
                Add(S,a[i][j][k],INF);
            }
            else Add(a[i][j][k],T,INF);
        }
    }
    ans>>=1;
    ans-=Maxflow(S,T,T+1);
    PR(ans);
}

BZOJ 1976 能量魔方 Cube(最小割)的更多相关文章

  1. Bzoj 1976: [BeiJing2010组队]能量魔方 Cube 最小割,最大流

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

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

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

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

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

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

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

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

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

  6. [BZOJ 3144] [Hnoi2013] 切糕 【最小割】

    题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...

  7. [BZOJ 3894] 文理分科 【最小割】

    题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...

  8. BZOJ 2039 人员雇佣 二元关系 最小割

    题面太长了,请各位自行品尝—>人员雇佣 分析: 借用题解的描述: a.选择每个人有一个代价Ai b.如果有两个人同时选择就可以获得收益Ei,j c.如果一个人选择另一个不选会产生代价Ei,j 这 ...

  9. BZOJ 2007 海拔(平面图最小割-最短路)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2007 题意:给出一个n*n的格子,那么顶点显然有(n+1)*(n+1)个.每两个相邻顶点 ...

随机推荐

  1. Java -verbose:gc 命令

    Java -verbose:gc 中参数-verbose:gc 表示输出虚拟机中GC的详细情况. [Full GC 168K->97K(1984K), 0.0253873 secs]   解读如 ...

  2. Power Gating的设计(模块二)

    针对lower power的验证,由cpf/upf来建模,包括: 1)power gating的功能模型(在power gate之后将output force为x) 2)isolation功能模型: ...

  3. Java中this关键字的使用

    本文介绍了在Java中this关键字的作用于使用方法 当局部变量和成员变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量.(this指的是当前对象自己) 如:public class ...

  4. gerrit docker运行失败 chown: /var/gerrit/review_site: Permission denied 【已解决】

    Docker Volume 之权限管理(转) - jackluo - 博客园 http://www.cnblogs.com/jackluo/p/5783116.html 为什么在公司电脑没有问题,但在 ...

  5. 使用Application Loader打包上传AppStore流程

    配置完你的证书,Bundle Identifier 和描述文件的配置 然后配置工程打开你项目工程 第一步,这里不能选择模拟器,选择iOS Device 如果不支持横屏,把这2个勾去掉 然后查看版本号和 ...

  6. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  7. js获取IP地址方法总结_转

    js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...

  8. Docker Centos安装Mysql5.6

    之前一篇随笔<Docker Centos安装Openssh> 写的是如何在基础的centos镜像中搭建ssh服务,在此基础上再搭建其他服务.本文继续介绍在centos_ssh基础上搭建my ...

  9. HDU 2136:Computer(树形DP)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 Computer     Description A school bought the fi ...

  10. Djnago的一些零碎知识点

    1.TEMPLATE_DIRS relative to the project folder http://stackoverflow.com/questions/9856683/using-pyth ...