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

题意:

思路:我们假设没有那个D的限制。这样就简
单了。贪心的话,我们只要在每一个纵轴上选择最小值即可。若看做最小割,我们可以从每一层的(x,y,z)向上一层的(x,y,z+1)连边流量为
v(x,y,z),这样就是增加一层R+1。然后原点向第一层连边,第R+1层向汇点连边。这样就是一个最小割,其实跟上面的贪心是一样的。现在有了D的
限制,我们看看怎么将这个限制加入到现在建好的网络流图中。我们将(x,y,z)向(x,y,z-D)这个格子四周的格子连边正无穷就OK了。这样当我们
选择了某边(x,y,z)到(x,y,z+1)的边时,比如在(x+1,y)

这个轴上我们就不能选择(x+1,y,z-D-1)和(x+1,y,z-D)这条边以及以下的边,因为(x,y,z)向(x+1,y,z-D)有边,因此
构不成割。

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

node edges[N*5];
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 cur[N],h[N],num[N],pre[N];

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

int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int s,t,n,m,K,d;
int a[55][55][55];

int OK(int x,int y)
{
    return x>=1&&x<=n&&y>=1&&y<=m;
}

int main()
{
    RD(n,m,K); RD(d);
    int i,j,k,x=0;
    FOR1(i,K+1) FOR1(j,n) FOR1(k,m) a[i][j][k]=++x;
    s=0; t=++x;
    clr(head,-1);
    FOR1(i,n) FOR1(j,m)
    {
        Add(s,a[1][i][j],INF);
        Add(a[K+1][i][j],t,INF);
    }
    FOR1(i,K) FOR1(j,n) FOR1(k,m)
    {
        RD(x);
        Add(a[i][j][k],a[i+1][j][k],x);
    }
    FOR1(i,K) if(i-d>=1) FOR1(j,n) FOR1(k,m)
    {
        FOR0(x,4) if(OK(j+dx[x],k+dy[x]))
        {
            Add(a[i][j][k],a[i-d][j+dx[x]][k+dy[x]],INF);
        }
    }
    PR(Maxflow(s,t,t+1));
}

BZOJ 3144 切糕(最小割)的更多相关文章

  1. BZOJ 3144 切糕 最小割

    题意: 一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d 求最小代价. 分析: 我猜肯定有人看题目就想到最小割了,然后一看题面理科否决了自己的这个想法…… 没错,就是最小 ...

  2. bzoj 3144 切糕 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 每个点拆成 R 个,连成一条链,边上是权值,割掉代表选这一层: 然后每个点的第 t 层 ...

  3. bzoj3144 [HNOI2013]切糕(最小割)

    bzoj3144 [HNOI2013]切糕(最小割) bzoj Luogu 题面描述见上 题解时间 一开始我真就把这玩意所说的切面当成了平面来做的 事实上只是说相邻的切点高度差都不超过 $ d $ 对 ...

  4. bzoj 3144: [Hnoi2013]切糕 最小割

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 681  Solved: 375[Submit][Status] ...

  5. 【BZOJ-3144】切糕 最小割-最大流

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1261  Solved: 700[Submit][Status] ...

  6. [BZOJ 3144] 切糕

    Link: BZOJ 3144 传送门 Solution: 发现要把点集分成不连通的两部分,最小割的模型还是很明显的 首先我们将原图转化为$R+1$层,从而将点权化为边权 关键还是在于建图是怎么保证$ ...

  7. BZOJ3144[Hnoi2013]切糕——最小割

    题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤ ...

  8. 【BZOJ3144】[Hnoi2013]切糕 最小割

    [BZOJ3144][Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q ...

  9. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

随机推荐

  1. 《zw版·Halcon-delphi系列原创教程》 邮票艺术品自动分类脚本

    <zw版·Halcon-delphi系列原创教程> 邮票艺术品自动分类脚本 邮票艺术品自动分类脚本,是个综合应用,有不同尺寸图像的自动识别.区域分割 还有作品附近文字的自动分割 此类项目, ...

  2. SessionHelper

    MXS&Vincene  ─╄OvЁ  &0000009 ─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好 ...

  3. HDU4288:Coder(线段树单点更新版 && 暴力版)

    Problem Description In mathematics and computer science, an algorithm describes a set of procedures ...

  4. Backup: Array in Perl6

    Array in Perl6 继承List,而List又继承Iterable,Positional,Cool ARRAY.pop ARRAY.shift ARRAY.push: VALUES ARRA ...

  5. android listview万能适配器

    参考    Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder { private Con ...

  6. Spring JDBC保存枚举对象含关键字报错原因之一

    报错信息: org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized S ...

  7. 为Docker容器配置固定IP

    当docker以桥接的方式启动容器时,容器内部的IP是经过DHCP获取的,例如:172.17.0.8/32,且每重启依次IP都会发生变动.某些特殊的情况下,需要容器内有自己固定的一个内部IP.我的实现 ...

  8. yii2框架安装

    注意:先把php.ini里面的php_openssl.dll扩展打开 1.下载yii2框架的文件包yii-advanced-app-2.0.7 2.打开路径为advanced下面的init.bat   ...

  9. python :生产者和消费者模型 即简单的协程

    def consumer(name): print('%s开始准备吃包子了' %name) while True: baozi=yield print('[%s]包子来了,被[%s]吃了' %(bao ...

  10. hdu4924 Football Manager

    这题上来我是没有思路的.因为目标值关涉到的因素太多而直接枚举的复杂度又太高. 目标值由两部分合成,一部分是队员的CA和与PA和,另一部分是队员之间的relationship. 前者是简单的代数累加,而 ...