BZOJ 3144 [Hnoi2013]切糕

3144: [Hnoi2013]切糕

Description

Input

第一行是三个正整数P,Q,R,表示切糕的长P、 宽Q、高R。第二行有一个非负整数D,表示光滑性要求。接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤P, 1≤y≤Q, 1≤z≤R)。 
100%的数据满足P,Q,R≤40,0≤D≤R,且给出的所有的不和谐值不超过1000。

Output

仅包含一个整数,表示在合法基础上最小的总不和谐值。

Sample Input

2 2 2
1
6 1
6 1
2 6
2 6

Sample Output

6

HINT

最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1


 

  恩。有个同学问我,为什么连几条inf就能保证割边在范围之内?我一下子语塞。过了很久才给了他答复,他一下子欢喜极了。

  另外,需关注题意。我本来连了8个方向,居然还懵了许久。

  对了,这是他的内容:

  这道题显然是一个网络流,我们如果不考虑每次要切的相邻的范围的地方的话,直接从每一竖列的下一层往上一层连边,大概是这么个效果

这里写图片描述
  对于切糕中的点,我们以虚线的所示方法连边,然后两边以INF的边连S和T,显然跑一边最小割就可以了,然而现在我们还要解决每次切的相邻的范围在d之内…这个对于我这个垃圾来说…简直是难题!…然后我们可以这样连 
这里写图片描述
  我们从上往下,建INF的边,具体操作是如果可以就向周围的下面的竖直坐标相差为d的点建边,这样一来为什么就可以保证割的边在范围之内呢?我们看上面的图,箭头为正向边的方向,假如图中的A部分被我们割掉了,现在如何才能保证左侧割掉的边一定在左侧的D区域呢?首先我们感性认知一下,现在还存在的路是C-D-B中间进过两条INF的边,还有一条路可以增广,也就是F-D-E这条路,D同时在这两条路里,如果只割一次,那么只能割D

  下一步我们看来思考为什么在两条路中各割一条会比在D中割一条不优…可能是我太智障了,我思考这个图思考了好久233,其实道理很简单啊,观察这张图,如果我们割掉三条长度为1的边,我们能把图增广完嘛?明显不是最小割嘛,割都没割,这里还有一条路嘛

这里写图片描述

  也就是说,你割外面的边而不割蓝色部分的边,你割都没割到要点,反而多花费了,并且还是有路(并且改路的最大流没有减少)可以通过去,也就是说图上还有一条经过蓝色边的路径可以被割,并且在你割不在蓝色路径上的边之后并没有对这条还可以增广的路造成影响 

  这道题由朱爷分享,代码如下:

 1 /**************************************************************
 2     Problem: 3144
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:1236 ms
 7     Memory:17652 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13  
14 template<class T>inline void readin(T &res) {
15     static char ch;T flag=1;
16     while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;
17     res=ch-48;while((ch=getchar())>='0'&&ch<='9')res=(res<<1)+(res<<3)+ch-48;res*=flag;
18 }
19  
20 const int N = 100100;
21 const int M = 1000010;
22 const int inf = 0x3f3f3f3f;
23 const int dx[] = {-1,1,0,0};
24 const int dy[] = {0,0,-1,1};
25 struct Edge {int v, upre, cap, flow;}g[M];
26 int head[N], ne=-1;
27 inline void adde(int u,int v,int cap) {
28     g[++ne]=(Edge){v,head[u],cap,0};head[u]=ne;
29     g[++ne]=(Edge){u,head[v],0,0};head[v]=ne;
30 }
31  
32 #include <queue>
33 std::queue<int> q;
34 int n, m, H, dlt, x, s, t, d[N], cur[N];
35 bool BFS() {
36     memset(d,0,sizeof(d));
37     while(!q.empty()) q.pop();
38     q.push(s);d[s]=1;
39     while(!q.empty()) {
40         int u=q.front();q.pop();
41         for( int i = head[u]; i!=-1; i = g[i].upre ) {
42             int v=g[i].v;
43             if(g[i].cap>g[i].flow&&!d[v]) {q.push(v);d[v]=d[u]+1;}
44         }
45     }
46     return d[t]!=0;
47 }
48 int DFS(int u,int a) {
49     if(u==t||a==0) return a;
50     int flow=0, f;
51     for( int &i = cur[u]; i!=-1; i = g[i].upre ) {
52         int v=g[i].v;
53         if(d[v]==d[u]+1&&(f=DFS(v,std::min(a,g[i].cap-g[i].flow)))>0) {
54             flow+=f;a-=f;
55             g[i].flow+=f;g[i^1].flow-=f;
56             if(a==0) break;
57         }
58     }
59     if(flow==0) d[u]=0;
60     return flow;
61 }
62 int maxflow() {
63     int flow=0;
64     while(BFS()) {
65         memcpy(cur,head,sizeof(head));
66         flow+=DFS(s,inf);
67     }
68     printf("%d\n",flow);
69 }
70 inline int pos(int i,int j,int h) {return (h-1)*n*m+(i-1)*m+j;}
71 int main() {
72     memset(head,-1,sizeof(head));
73     readin(n);readin(m);readin(H);readin(dlt);s=0;t=66000;
74     for( int i = 1; i <= n; i++ ) for( int j = 1; j <= m; j++ ) adde(s,pos(i,j,1),inf), adde(pos(i,j,H+1),t,inf);
75     for( int i = 1; i <= n; i++ ) for( int j = 1; j <= m; j++ ) for( int h = 1; h <= H+1; h++ ) if(h+dlt<=H+1)
76         for( int k = 0; k < 4; k++ ) if(1<=i+dx[k]&&i+dx[k]<=n&&1<=j+dy[k]&&j+dy[k]<=m) adde(pos(i+dx[k],j+dy[k],h+dlt),pos(i,j,h),inf); 
77     for( int h = 1; h <= H; h++ ) for( int i = 1; i <= n; i++ ) for( int j = 1; j <= m; j++ ) readin(x),adde(pos(i,j,h),pos(i,j,h+1),x);
78     maxflow();
79     return 0;
80 }
81 
dinic最小割建图(1236 ms 17652 kb)

  对了,其中最后一层可以压缩。

 1 /**************************************************************
 2     Problem: 3144
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:1112 ms
 7     Memory:17652 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13  
14 template<class T>inline void readin(T &res) {
15     static char ch;T flag=1;
16     while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;
17     res=ch-48;while((ch=getchar())>='0'&&ch<='9')res=(res<<1)+(res<<3)+ch-48;res*=flag;
18 }
19  
20 const int N = 100100;
21 const int M = 1000010;
22 const int inf = 0x3f3f3f3f;
23 const int dx[] = {-1,1,0,0};
24 const int dy[] = {0,0,-1,1};
25 struct Edge {int v, upre, cap, flow;}g[M];
26 int head[N], ne=-1;
27 inline void adde(int u,int v,int cap) {
28     g[++ne]=(Edge){v,head[u],cap,0};head[u]=ne;
29     g[++ne]=(Edge){u,head[v],0,0};head[v]=ne;
30 }
31  
32 #include <queue>
33 std::queue<int> q;
34 int n, m, H, dlt, x, s, t, d[N], cur[N];
35 bool BFS() {
36     memset(d,0,sizeof(d));
37     while(!q.empty()) q.pop();
38     q.push(s);d[s]=1;
39     while(!q.empty()) {
40         int u=q.front();q.pop();
41         for( int i = head[u]; i!=-1; i = g[i].upre ) {
42             int v=g[i].v;
43             if(g[i].cap>g[i].flow&&!d[v]) {q.push(v);d[v]=d[u]+1;}
44         }
45     }
46     return d[t]!=0;
47 }
48 int DFS(int u,int a) {
49     if(u==t||a==0) return a;
50     int flow=0, f;
51     for( int &i = cur[u]; i!=-1; i = g[i].upre ) {
52         int v=g[i].v;
53         if(d[v]==d[u]+1&&(f=DFS(v,std::min(a,g[i].cap-g[i].flow)))>0) {
54             flow+=f;a-=f;
55             g[i].flow+=f;g[i^1].flow-=f;
56             if(a==0) break;
57         }
58     }
59     if(flow==0) d[u]=0;
60     return flow;
61 }
62 int maxflow() {
63     int flow=0;
64     while(BFS()) {
65         memcpy(cur,head,sizeof(head));
66         flow+=DFS(s,inf);
67     }
68     printf("%d\n",flow);
69 }
70 inline int pos(int i,int j,int h) {if(h==H+1) return t;return (h-1)*n*m+(i-1)*m+j;}
71 int main() {
72     memset(head,-1,sizeof(head));
73     readin(n);readin(m);readin(H);readin(dlt);s=0;t=66000;
74     for( int i = 1; i <= n; i++ ) for( int j = 1; j <= m; j++ ) adde(s,pos(i,j,1),inf);
75     for( int i = 1; i <= n; i++ ) for( int j = 1; j <= m; j++ ) for( int h = 1; h <= H+1; h++ ) if(h+dlt<=H+1)
76         for( int k = 0; k < 4; k++ ) if(1<=i+dx[k]&&i+dx[k]<=n&&1<=j+dy[k]&&j+dy[k]<=m) adde(pos(i+dx[k],j+dy[k],h+dlt),pos(i,j,h),inf); 
77     for( int h = 1; h <= H; h++ ) for( int i = 1; i <= n; i++ ) for( int j = 1; j <= m; j++ ) readin(x),adde(pos(i,j,h),pos(i,j,h+1),x);
78     maxflow();
79     return 0;
80 }
81 
dinic最小割建图(1112 ms 17652 kb)

 

转载于:https://www.cnblogs.com/Doggu/p/BZOJ3144.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java java 大端_Java 大小端转换

package nlp.nlp;/*** 小端数据&#xff0c;Byte转换**/public class ByteConvert {public static void main(String[] args) {ByteConvert c new ByteConvert();c.Int2Bytes_LE(126);}public static final int UNICODE_LEN 2;/*** int转换为小端byte[](高位放在高地址中)* p…

《ASP.NET Core 6框架揭秘》实例演示[18]:HttpClient处理管道

在《《ASP.NET Core 6框架揭秘》实例演示[17]&#xff1a;利用IHttpClientFactory工厂来创建HttpClient》之后&#xff0c;我们将关注点放到HttpClient对象上。我们知道ASP.NET的核心就是由中间件组成的请求处理管道&#xff0c;HttpClient也采用了类似的设计。HttpClient管道由…

腾讯云副总裁答治茜:移动互联网破局要借助“三张网”

5月24日&#xff0c;2018腾讯云未来峰会在广州召开。在互联网专场上&#xff0c;腾讯云副总裁答治茜就泛互联网行业云化的主题发表演讲。在演讲中答治茜表示&#xff0c;过去移动互联网的高速增长到现在已经遇到了一个天花板&#xff0c;需要借助马化腾提到的“人联网、物联网、…

雅诗兰黛天猫超级品牌日:未央唇膏、红装小棕瓶“当红不让”

随着年末圣诞季的临近&#xff0c;各大美妆品牌陆续推出了圣诞套装&#xff0c;红红火火的超豪华套装&#xff0c;算是对用户最实在的回馈。高端美妆品牌的“领头羊”雅诗兰黛&#xff0c;当然也“当红不让”&#xff0c;趁着圣诞季&#xff0c;与天猫超级品牌日联手打造了一场…

JAVA常见算法题(三十一)---冒泡排序

package com.jege.spring.boot.hello.world;/*** java算法之冒泡排序<br>* 将数组按照从大到小的顺序排列<br>* * * author Administrator**/ public class BubbleSort{public static void main(String[] args){int score[] {67, 69, 75, 87, 89, 90, 99, 100};fo…

java 1.7的新特性_[Java]  JDK 1.7版本的 新特性

在网上看到一些jdk1.7的新特性&#xff0c;现将我觉得比较实用的记录于下&#xff1a;(1)switch中可以使用字串了String s "test";switch (s) {case "test" :System.out.println("test");case "test1" :System.out.println("tes…

WPF实现物理效果 拉一个小球

原文:WPF实现物理效果 拉一个小球一直以来都对物理效果有神秘感,完全不知道怎么实现的.直到看到了周银辉在老早前写的一篇博客:http://www.cnblogs.com/zhouyinhui/archive/2007/06/23/793724.html 终于知道是怎么实现的了. CompositionTarget类的Rendering事件.在每一帧成功渲…

C# CM框架下一行代码实现多页面管理

概述之前我分享过一个wpf的项目实践&#xff0c;主页面左侧是个listbox&#xff0c;每次选择改变后呈现对应的页面&#xff0c;界面图如下&#xff1a;要实现这样一个功能&#xff0c;我之前是采用传统方式实现的&#xff0c;本节我采用CM框架下的Conductor<T>去实现&…

如何用DW设计界面 结合 VS设计后台代码

原文发布时间为&#xff1a;2008-11-02 —— 来源于本人的百度文章 [由搬家工具导入]问&#xff1a;在vs.net里有form标记&#xff0c;而dw里却没有&#xff0c;两个里面的标记代码都不一样&#xff0c;怎么能通用&#xff1f; 在.net里修改dw的文件&#xff0c;或在dw里修改a…

java中instanceof 详解_java中的instanceof用法详解

instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例&#xff0c;返回的是boolean类型的数据。用它来判断某个对象是否是某个Class类的实例。用法&#xff1a;boolean result object instanceof class参数&#xf…

关于JAVA异常处理的20个最佳实践

关于JAVA异常处理的20个最佳实践 在我们深入了解异常处理最佳实践的深层概念之前&#xff0c;让我们从一个最重要的概念开始&#xff0c;那就是理解在JAVA中有三种一般类型的可抛类: 检查性异常(checked exceptions)、非检查性异常(unchecked Exceptions) 和 错误(errors)。 异…

Atitit Data Matrix dm码的原理与特点

Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode&#xff0c;由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。 Datamatrix是一种矩阵式二维条码&#xff0c;其发展的构想是希望在较小的条码标签上存入更多的资料量。Datamatrix的最小…

SSM框架搭建(四) springmvc和mybatis的配置

SSM框架搭建&#xff08;一&#xff09; JDK和MAVEN环境搭建 SSM框架搭建&#xff08;二&#xff09; 创建MAVEN项目 SSM框架搭建&#xff08;三&#xff09; 数据库创建和MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件 SSM框架搭建&#xff08;四&#xff09; sprin…

10 个有关 String 的面试问题

2019独角兽企业重金招聘Python工程师标准>>> 下面是面试中最容易问到的有关String的问题。 1. 如何比较两个字符串&#xff1f;使用“”还是equals()方法&#xff1f; 简单来讲&#xff0c;“”测试的是两个对象的引用是否相同&#xff0c;而equals()比较的是两个字…

基于ASP.NET Core 6.0的整洁架构

背景最近尝试录制了一个系列视频&#xff1a;《ASP.NET Core 6.0Vue.js 3 实战开发》&#xff0c;本节是视频内部整洁架构的理论和实战的文字稿。因为在录制之前&#xff0c;我通常会编写完整的文字内容作为视频文案&#xff0c;这里分享给大家&#xff0c;希望对你有所帮助。如…

大并发数据队列

图解#include<stdio.h>#include<stdlib.h>#include<memory.h>#define N 100#define mytype intstruct MyQueue{mytype data[N];//数组存储队列int front;//拉屎int rear;//吃东西};typedef struct MyQueue myQ;//初始化void init(myQ *p){p->front p->…

java单精度实型_Java的八种基本类型及其各种数据类型的相互转换

一、八种基本类型1、六种数字类型(四个整数型&#xff0c;两个浮点型)字节型byte 8位-2^7到2^7短整型short 16位整型int 32位 长整型long 64位单精度float 32位 双精度double 64位2、一种字符类型字符型char 8位3、还有一种布尔型。布尔型&#xff1a;boolean 8位 可存储&q…

geotrellis使用(二十九)迁移geotrellis至1.1.1版

目录 前言升级过程总结一、前言 由于忙着安装OpenStack等等各种事情&#xff0c;有半年的时间没有再亲密的接触geotrellis&#xff0c;甚至有半年的时间没能畅快的写代码。近来OpenStack折腾的稍见成效&#xff0c;历经九九八十一Failure后成功的在16台服务器上搭建了云平台&am…

python中的logger模块详细讲解

logger 提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送到合适的目的输出filter提供了细度设备来决定输出哪条日志记录formatter决定日志记录的最终输出格式 logging模块介绍 Python的logging模块提供了通用的日志系统&#xff0c;熟练使用logging模块可…

总在用户态调试 C# 程序,终还是搭了一个内核态环境

一&#xff1a;背景 一直在用 WinDbg 调试用户态程序&#xff0c;并没有用它调试过 内核态&#xff0c;毕竟不是做驱动开发&#xff0c;也没有在分析 dump 中需要接触用内核态的需求&#xff0c;但未知的事情总觉得很酷&#xff0c;加上最近在看 《深入解析 Windows 操作系统》…