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

题意:n*m的格子染色黑白,对于格子(i,j)染黑色则价值为A[i][j],白色为B[i][j]。若一个格子四周不同颜色的有x个,则额外的价值为x*C[i][j]。求最大价值。

思路:将格子黑白染色分成两个集合X和Y。S集合为X中的A和Y中的B,T为X中的B和Y中的A。相邻的连边为两个格子的C值之和。总权值减去最小割即是答案。

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[105][105],b[105][105];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};

int main()
{
    RD(n,m);
    int i,j,k=0;
    FOR1(i,n) FOR1(j,m) a[i][j]=++k;
    clr(head,-1);
    int ans=0;
    int s=0,t=n*m+1;
    FOR1(i,n) FOR1(j,m)
    {
        RD(k);
        ans+=k;
        if((i+j)&1) Add(s,a[i][j],k);
        else Add(a[i][j],t,k);
    }
    FOR1(i,n) FOR1(j,m)
    {
        RD(k);
        ans+=k;
        if(!((i+j)&1)) Add(s,a[i][j],k);
        else Add(a[i][j],t,k);
    }
    FOR1(i,n) FOR1(j,m) RD(b[i][j]);
    int x,y;
    FOR1(i,n) FOR1(j,m) FOR0(k,4)
    {
        x=i+dx[k];
        y=j+dy[k];
        if(x>=1&&x<=n&&y>=1&&y<=m)
        {
            ans+=b[i][j];
            Add(a[i][j],a[x][y],b[i][j]+b[x][y]);
        }
    }
    ans-=Maxflow(s,t,t+1);
    PR(ans);
}

BZOJ 2132 圈地计划(最小割)的更多相关文章

  1. [BZOJ]2132: 圈地计划 最小割

    圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一 ...

  2. BZOJ 2131 圈地计划(最小割+黑白染色)

    类似于happiness的一道题,容易想到最小割的做法. 但是不同的是那一道题是相邻的如果相同则有收益,这题是相邻的不同才有收益. 转化到建图上面时,会发现,两个相邻的点连的边容量会是负数.. 有一种 ...

  3. 【BZOJ2132】圈地计划 最小割

    [BZOJ2132]圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地. ...

  4. bzoj 2132 圈地计划(黑白染色,最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2132 [题意] 给定n*m个区域,建工业区价值A,建商业区价值B,如果(i,j)有k个 ...

  5. bzoj 2132 圈地计划【最小割+dinic】

    对于网格图,尤其是这种要求相邻各自不同的,考虑黑白染色 对于这张染色后图来说: 对于每个黑格: 表示初始时选择商业区: s点向它连商业区收益的流量,它向t点连工业区收益的流量: 割断S侧的边说明反悔, ...

  6. bzoj 2132: 圈地计划

    #include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...

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

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

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

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

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

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

随机推荐

  1. 夺命雷公狗---微信开发62----所以memcache对access_token进行全局缓存优化

    公众号调用接口并不是无限制的,为了防止公众号的程序错误而引发微信服务器负载异常,默认情况下, 每个公众号调用接口都不能超过一定限制,当超过一定限制时,调用对应接口会收到错误信息,造成调用失败. 我们也 ...

  2. 手机端js事件支持(event)

    http://blog.163.com/rex_blog/blog/static/1944801012013102743014369/ 所有被测试的浏览器都支持touchstart.touchend和 ...

  3. Javascript之回调函数(callback)

    1.回调函数定义: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方 ...

  4. echo date

    echo -n 不换行 echo -n '123';echo '456' #结果:123456 echo -e  启用下列反斜杠转义的解释 \b 退格 \t制表 \n 换行 \r 回车 echo -e ...

  5. EL表达式,JSTL:jsp standard Tag Library

    1.EL表达式的作用: 1.1访问Bean的属性.  方式一:${对象名 . 属性名} eg:${user.name}    方式二:${对象名["属性名"]} 1.2输出简单的运 ...

  6. Delphi内嵌汇编语言BASM精要(转帖)

    1 BASM概念简要  汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb        // 单指令语句 jmp @Here    // 一个表达式: ...

  7. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  8. VC中常用的宏

        我们在VS环境中开发的时候,会遇到很多宏定义,这些宏可以应用到代码中,或用于编译.工程选项等设置,总之是我们开发中必不可少的工具,有必要做一个总结.有些宏是C/C++定义的,有些宏是VC环境预 ...

  9. HDU 5961:传递(暴搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=5961 题意:中文题意.给出两个图,判断这个两个图是否都是传递的.注意一下传递的定义要看清,一开始没看清连样例都看 ...

  10. 浅谈SQL中的单引号

    单引号:对很对计算机语言包括(SQL)是做字符串引用的:这个是大家通常知道的作用:但是对SQL语言来说:还有另外一个作用是作引号的转义 总结下:对oracle(sql)的作用. 做字符串引用:例如'a ...