题目描述

网址:https://daniu.luogu.org/problemnew/show/3227
大意:
平面上有一长方体,目标为将其切割为上下两半。
切割点为\((x,y,z)\)的点,每个点有一个不和谐值v,现在有两个要求:

  • [1]任何两个平面相邻的切割点之间的高度差不能超过D
  • [2]要使得最终的不和谐值最小。
    求解最小的$ ∑vi $

题目解法

直接建图,化点为边。将最下面的点与S相连,最上面的与T相连。
然后跑最小割即为答案。
现在关键在于如何限制高度差不超过D。
以\((x,y,z)\)与\((x+1,y,z)\)为例。
建立\((x,y,z) —>(x+1,y,z-D)\) 与 \((x+1,y,z+D+1)—>(x,y,z+1)\)两条边
那么在割断\((x,y,z)->(x,y,z+1)\)时,就可保证\((x+1,y)\)上割的为题目所限制范围。
动手画一下就明白了。 如果割超出范围的边,S、T依旧联通。
所以用上述方法建图,然后跑最小割即可得到答案。

实现代码

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define ll long long
#define RG register
#define IL inline
#define maxn 125000
#define INF 1e16+7
using namespace std;

IL ll gi(){
    RG ll date = 0, m = 1;  RG char ch = 0;
    while(ch!='-'&&(ch<'0'||ch>'9'))ch = getchar();
    if(ch == '-'){m = -1; ch = getchar();}
    while(ch>='0' && ch<='9')
       {date=date*10+ch-'0'; ch = getchar();}
    return date*m;
}

ll cnt,Q,P,R,S,T,D;
ll vis[maxn],dep[maxn],head[maxn],cur[maxn];
ll mx[4] = {0,0,-1,1},my[4] = {-1,1,0,0};
struct Road { ll to,next,cap,flow; }t[20*maxn];

IL bool Bfs(){
    for(RG ll i = 0; i <= T; i ++)vis[i] = 0;
    dep[S] = 0; vis[S] = 1; queue<ll>Que; Que.push(S);
    while(!Que.empty()){
        RG ll u = Que.front(); Que.pop();
        for(RG ll i = head[u]; i!= -1; i = t[i].next){
            RG ll v = t[i].to;
            if(!vis[v] && t[i].cap > t[i].flow){
                dep[v] = dep[u] + 1;
                vis[v] = true; Que.push(v);
            }
        }
    }return vis[T];
}

int Dfs(RG ll u,RG ll Lim){
    if(u == T || Lim == 0)return Lim;
    RG ll flow =0,f = 0;
    for(RG ll &i = cur[u]; i != -1; i = t[i].next){
        RG ll v = t[i].to;
        if(dep[v] == dep[u] + 1 && (f = Dfs(v,min(Lim,t[i].cap-t[i].flow))) > 0){
            flow += f; Lim -= f;
            t[i].flow += f; t[(i^1)].flow -= f;
            if(Lim == 0)break;
        }
    }return flow;
}

IL int Dinic(){
    RG ll Flow = 0;
    while(Bfs()){
        for(RG ll i = 0; i <= T; i ++)cur[i] = head[i];
        Flow += Dfs(S,INF);
    }return Flow;
}

IL ll Cod(RG ll z,RG ll x,RG ll y){
    return z*(P*Q) + (x-1)*Q + y;
}

IL void Add(ll uu,ll vv,ll cc){
    t[cnt++] = (Road){vv,head[uu],cc,0}; head[uu] = cnt - 1;
    t[cnt++] = (Road){uu,head[vv],0,0};  head[vv] = cnt - 1;
}

int main(){
    freopen("testdate.in","r",stdin);
    P = gi(); Q = gi(); R = gi(); D = gi();
    S = 0; T = R*P*Q+P*Q+1;
    for(RG ll i = 0; i <= T; i ++)head[i] = -1;
    for(RG ll h = 1; h <= R; h ++)
        for(RG ll i = 1; i <= P; i ++)
            for(RG ll j = 1; j <= Q; j ++)
                Add( Cod(h,i,j) , Cod(h-1,i,j) , gi());
    for(RG ll i = 1; i <= P; i ++)
        for(RG ll j = 1; j <= Q; j ++)
            Add(Cod(0,i,j),T,INF);
    for(RG ll i = 1; i <= P; i ++)
        for(RG ll j = 1; j <= Q; j ++)
            Add(S,Cod(R,i,j),INF);
    for(RG ll h = 1; h <= R; h ++)
        for(RG ll i = 1; i <= P; i ++)
            for(RG ll j = 1; j <= Q; j ++)
                for(RG ll f = 0; f < 4; f ++){
                    RG int x = mx[f]+i,y = my[f]+j;
                    if(x<1||y<1||x>P||y>Q)continue;
                    if(h-D>=0)Add(Cod(h-D,x,y),Cod(h,i,j),INF);
                    if(h+D<=R)Add(Cod(h,i,j),Cod(h+D,x,y),INF);
                }

    RG ll Ans = Dinic(); printf("%lld",Ans);
    return 0;
}

[HNOI2013]切糕的更多相关文章

  1. BZOJ 3144: [Hnoi2013]切糕

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

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

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

  3. BZOJ_3144_[Hnoi2013]切糕_最小割

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

  4. bzoj千题计划142:bzoj3144: [Hnoi2013]切糕

    http://www.lydsy.com/JudgeOnline/problem.php?id=3144 如果D=2 ,两个点,高度为4,建图如下 #include<queue> #inc ...

  5. 【BZOJ3144】[HNOI2013]切糕

    [BZOJ3144][HNOI2013]切糕 题面 题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑 ...

  6. 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1764  Solved: 965 Description Inp ...

  7. BZOJ3144 Hnoi2013 切糕 【网络流】*

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

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

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

  9. 3144: [Hnoi2013]切糕

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

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

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

随机推荐

  1. 解决angularjs 在ie8上面 ng-repeat的select控件兼容性问题

    问题描述: 在ie8下生成select的option时候使用ng-repeat,会造成下拉列表的列表显示值为{{x.displayname}}的形式,但是选中之后,选中值却又是正确的,此问题不在chr ...

  2. alertifyjs

    <%@ page contentType="text/html; charset=UTF-8"%> <!DOCTYPE html PUBLIC "-// ...

  3. Zabbix 3.0 监控Web

    zabbix 界面配置 触发器添加

  4. Array 数组的排序 sort

    JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...

  5. sql server在一个字段相同值时,另一个字段结果拼接

    如下字段红框里的信息都一样的,通过转换实现字段拼接 SELECT formmain_id,(SELECT field0040+';' FROM formson_5489 WHERE formmain_ ...

  6. WinForm中使用DDE技术(含源码)

    提起DDE技术,相信很多人不知道是啥东东,尤其是90后的程序员们.不过,有时候这个东西还是有用处的,用一句话可以总结:实现Winform程序间的通信.比如:两个Winform程序A和B需要实现通信,用 ...

  7. SDK编程之多线程编程

    本课中,我们将学习如何进行多线程编程.另外我们还将学习如何在不同的线程间进行通信. 理论:前一课中,我们学习了进程,其中讲到每一个进程至少要有一个主线程.这个线程其实是进程执行的一条线索,除此主线程外 ...

  8. 【netty这点事儿】ByteBuf 的使用模式

    堆缓冲区 最常用的 ByteBuf 模式是将数据存储在 JVM 的堆空间中. 这种模式被称为支撑数组(backing array), 它能在没有使用池化的情况下提供快速的分配和释放. 直接缓冲区 直接 ...

  9. angular4升级angular5问题记录之No NgModule metadata found for 'AppModule'

    在将项目从angular4升级到angular5的过程中,出现No NgModule metadata found for 'AppModule'问题,网上查找答案将app.module.ts进行再次 ...

  10. crontab定时任务(centos)

    cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbi ...