[bzoj2132][网络流-最小割]圈地计划

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Description

最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old
Idiots)手中得到了一块开发土地。据了解,
这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根
据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,
建造商业区将得到Aij收益,建造工业区将得到Bij收益。另外不同的区域连在一起可以得到额外的收益,即如果区
域(I,j)相邻(相邻是指两个格子有公共边)有K块(显然K不超过4)类型不同于(I,j)的区域,则这块区域能增加k
×Cij收益。经过Tiger.S教授的勘察,收益矩阵A,B,C都已经知道了。你能帮GDOI求出一个收益最大的方案么?

Input

输入第一行为两个整数,分别为正整数N和M,分别表示区域的行数和列数; 第2到N+1列,每行M个整数,表示商业区收益矩阵A;
第N+2到2N+1列,每行M个整数,表示工业区收益矩阵B; 第2N+2到3N+1行,每行M个整数,表示相邻额外收益矩阵C。
任何数字不超过1000”的限制

Output

输出只有一行,包含一个整数,为最大收益值。

Sample Input

3 3

1 2 3

4 5 6

7 8 9

9 8 7

6 5 4

3 2 1

1 1 1

1 3 1

1 1 1

Sample Output

81

HINT

【数据规模】

对于100%的数据有N,M≤100

题解

跑朴素最小割的话,我们会发现一个问题
设两个点(i,j),(x,y),处于不同集合,那么他们中间的那条边其实是一定要割去的,也就是C[i][j]+C[x][y]肯定会损失。如果想不损失的话这个玩意要建负权。。
所以我们黑白染色。
相邻的格子连边不同
设白点 st->点连边 流量A[i][j],点->ed连边,流量B[i][j]
黑点相反
那么这样我们可以发现,当黑点与白点同在一个集合时,他们其实是不同的地。。那么中间连的C[i][j]+C[x][y]不会损失,反之亦然

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
    int x,y,c,next,other;
}a[4110000];int len,last[11000];
const int dx[4]={0,-1,0,1};
const int dy[4]={-1,0,1,0};
void ins(int x,int y,int c)
{
    int k1,k2;
    k1=++len;
    a[len].x=x;a[len].y=y;a[len].c=c;
    a[len].next=last[x];last[x]=len;
    k2=++len;
    a[len].x=y;a[len].y=x;a[len].c=0;
    a[len].next=last[y];last[y]=len;
    a[k1].other=k2;a[k2].other=k1;
}
int h[11000],list[2500000],head,tail,st,ed;
bool bt_h()
{
    memset(h,0,sizeof(h));
    head=1;tail=2;list[1]=st;h[st]=1;
    while(head!=tail)
    {
        int x=list[head];
        for(int k=last[x];k;k=a[k].next)
        {
            int y=a[k].y;
            if(h[y]==0 && a[k].c>0)
            {
                h[y]=h[x]+1;
                list[tail++]=y;
            }
        }
        head++;
    }
    if(h[ed]>0)return true;
    return false;
}
int findflow(int x,int f)
{
    if(x==ed)return f;
    int s=0,t;
    for(int k=last[x];k;k=a[k].next)
    {
        int y=a[k].y;
        if(h[y]==h[x]+1 && a[k].c>0 && s<f)
        {
            s+=(t=findflow(y,min(a[k].c,f-s)));
            a[k].c-=t;a[a[k].other].c+=t;
        }
    }
    if(s==0)h[x]=0;
    return s;
}
int n,m;
int A[110][110],B[110][110],C[110][110];
int col[110][110];
int pt(int x,int y){return (x-1)*m+y;}
int main()
{
    scanf("%d%d",&n,&m);
    int sum=0;
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&A[i][j]),sum+=A[i][j];
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&B[i][j]),sum+=B[i][j];
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
    {
        scanf("%d",&C[i][j]);
        for(int k=0;k<=3;k++)if(i+dx[k]>=1 && i+dx[k]<=n && j+dy[k]>=1 && j+dy[k]<=m)sum+=C[i][j];
    }
    st=n*m+1;ed=n*m+2;
    memset(col,0,sizeof(col));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(i==1 && j==1)continue;
            if(j==1)col[i][j]=col[i-1][j]^1;
            else col[i][j]=col[i][j-1]^1;
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(col[i][j]==0)ins(st,pt(i,j),A[i][j]),ins(pt(i,j),ed,B[i][j]);
            else ins(st,pt(i,j),B[i][j]),ins(pt(i,j),ed,A[i][j]);
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=0;k<=3;k++)
            {
                int x=i+dx[k],y=j+dy[k];
                if(x<1 || x>n || y<1 || y>m)continue;
                ins(pt(i,j),pt(x,y),C[i][j]+C[x][y]);   
            }
    int ans=0;
    while(bt_h())ans+=findflow(st,999999999);
    printf("%d\n",sum-ans);
    return 0;
}
BZOJ 2132: 圈地计划网络流二元关系) 题目 这个题,求最大值,那么先把所有值加起来-最小割。 那么我们的二元关系应该是选同样有∣x−i∣+∣y−j∣=1,Cij+Cxy|x-i|+|y-j|=1,C_{ij}+C_{xy}∣x−i∣+∣y−j∣=1,Cij​+Cxy​的代价。 相异代价-相同代价 &lt; 0。 需要反转,中间代价为C之和。 具体看:pty《浅析一类最小割问题》 AC Code: #include&lt;bits/st... 阅读详情

相关推荐

[Bzoj3232]圈地游戏(分数规划+最小割/spfa判负环)

Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用。 DZY喜欢在地里散步。他总是从任意一个格点出发,沿着格线行走直到回到出发点,且在行走途中不允许与已走过的路线有任何相交或触碰(出发点除外)。记这条封闭路线内部的格子总价值为V,路线上的费用总和为C,DZY想知道V/C的最大值是多少。 Input ...

weixin_30613433的博客 310

【GDKOI2010】圈地计划

【GDKOI2010】圈地计划(二元关系网络流

White_gugu的博客 151

网络流之方格取数问题nefu482

分析(引用 BYvoid大牛的分析): 二分图点权最大独立集,转化为最小割模型,从而用最大流解决。 建模方法: 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 X集合中顶点,白色格子看做Y集合顶点,建立附加 源 S汇T。 1、从 S向 X 集合中每个顶点连接一条容量为格子中数值的有向边。 2、从 Y集合中每个顶点向 T 连接一条容量为格子中数值的有向边。 3、相邻黑白格

银之夏雪的博客 513

【GDKOI2010】圈地计划网络流

题目最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,建造商业区将得到Aij收益,建造工业

Andy&Calrn的博客 726

[GDKOI2010] 圈地计划(网络流)

题2链接:https://www.luogu.org/problemnew/show/P1935 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环...

weixin_30917213的博客 130

bzoj2132圈地计划 网络流最小割

题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区域,建造商业区将得到...

weixin_30653023的博客 108

BZOJ2132圈地计划最小割

BZOJ2132圈地计划最小割) 题面 BZOJ 题解 对我而言,不可做!!! 所以我膜烂了ZSY大佬 他的博客写了怎么做。。。 这,,。。。太强啦!! 完全想不到黑白染色之后反着连边 然后强行把同侧转化成异侧求最小割。。。 #include<iostream> #include<cstdio> #include<cstdlib> #include<...

weixin_30384031的博客 86

BZOJ2132圈地计划 最小割

BZOJ2132圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。...

aodanchui1057的博客 146

BZOJ 2132 圈地计划最小割

题目链接: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。相邻的连...

weixin_34232363的博客 133

BZOJ2132 圈地计划

传送~ 来自y_immortal学长的网络流推荐2333 建模比较神仙qwq 首先可以建立最小割模型 -&gt;二选一 就是我们处理不同的贡献不好处理 那么我们考虑怎么把它变成相同的贡献 对于原图我们进行黑白染色 然后如果一个点属于T集我们让它反色就可以做到相同的有贡献 那么很明显这个贡献是双向的 对于两个点之间的贡献是相加的 所以我们这样做最小割就可以辣~ 代码。 //Lov...

寒雨微凝's Blog 248

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

圈地计划 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地。据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域。GDOI要求将这些区域分为商业区和工业区来开发。根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值。更具体点,对于第i行第j列的区

Eternal_Despair 1317

bzoj2132: 圈地计划最小割

题目传送门 网络流的题对于我这种蒟蒻来说真是玄学。 搞了一个晚上。。。。解法: 直接求最大利益不好做。 我们考虑将问题转化。。 将所有的利益加起来(显然不可能) 然后减去一些东西。。 那么我们怎么表示减去的东西呢。 将问题转化为(我是这么理解的): 首先根据题目一个点不能同时建两个区。 就是说只能建商业区或工业区。 然后若相邻的两个点建同样的区的话那么利益就损失了c[i][j]

Hanks_o的博客 433

BZOJ2132: 圈地计划

【传送门:BZOJ2132】 简要题意:   给出一个n*m的矩阵,每个格子可以选择成为2种状态,分别获得A[i][j]和B[i][j]的收益,并且能额外获得C[i][j]*k(k为相邻的与(i,j)不同状态的格子数)的收益,求出怎样确定每个格子的状态使得总收益最大 题解:   最小割中黑白染色方法运用例题   %%%Cherish_OI   一开始将相邻的点染成黑白两色,然后...

weixin_30572613的博客 77

bzoj 2132: 圈地计划 网络流

题目传送门分析很容易看出是用最小割来做,关键是要找出如何建图。 注意到如果不染色的话没那么好做,所以先把所有点黑板染色,s向黑点连流量为A[i,j]的边,白点向t连流量为B[i,j]的边。对于两个相邻的节点(x1,y1)和(x2,y2),分别从x向y和y向x连一条流量为C[x1,y1]+C[x2,y2]的边,然后跑最大流即可。代码#include<iostream> #include<cstdio

beginend 373

BZOJ】【2132圈地计划

网络流/最小割   Orz Hzwer   这类大概是最小割建模中的经典应用吧……   黑白染色,然后反转黑色的技巧感觉很巧妙!这个转化太神奇了…… 1 /************************************************************** 2 Problem: 2132 3 User: Tunix ...

weixin_30876945的博客 135

BZOJ 2132 圈地计划 最小割

题目大意:有一个n*m的矩阵,在矩阵中填1或2会得到不同的权值。相邻的两个格子数字不相同会得到额外的权值,求最大权值最小割模型:同一事件两种选择获得不同收益,一定条件下有额外收益,求最大收益。在本题中,相邻格子填不同数字会获得额外收益,于是将矩阵黑白染色(i+j&1),每个黑色格子与S连边代表填1,与T连边代表填2,白色反过来。在相邻的两点之间连一条容量为收益的边。跑一边最大流求最小割用总和减去即为

YihAN_Z 381

[BZOJ2132]圈地计划最小割

还真实以历史,还生命以过程——这就是人类的大明智。

zyf2000 729

bzoj 2132圈地计划最小割

长夜孤冷,魂梦无归,叹落花流水亦无踪

reverie_mjp的博客 518
上一篇: [bzoj3175][bzoj4808][网络流-最小割]攻击装置/马
下一篇: [bzoj2469][dfs]简单数谜
Rose_max
博客等级 码龄10年 97粉丝 610原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值