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,一经查实,立即删除!

相关文章

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

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

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

随着年末圣诞季的临近&#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…

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>去实现&…

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

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

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->…

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

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

bat kafka启动_windows下搭建Kafka,并通过命令窗口收发消息

参考网址&#xff1a;前提条件&#xff1a;windows环境需要安装jdk2.由于Kafka依赖于zookeeper&#xff0c;所以也需要下载zookeeper,可以通过官网下载http://zookeeper.apache.org/3.安装zookeeper将压缩包解压后&#xff0c;到bin目录下&#xff0c;启动zkServer.bat即可注意…

异常处理、socke基于TCP协议编程

一、异常处理 1、错误和异常 1.程序中难免出现错误&#xff0c;而错误分成两种 &#xff08;1&#xff09;语法错误&#xff08;这种错误过不了Python解释器的语法检测&#xff0c;必须在程序执行前改正&#xff09; #语法错误示范一 if#语法错误示范二 def test:pass#语法错误…

windows下apache报错The requested operation has failed解决方法

2019独角兽企业重金招聘Python工程师标准>>> Apache报错The requested operation has failed&#xff0c;基本上是因为端口被占用。解决方法如下&#xff1a; 第一步&#xff0c;运行cmd&#xff0c;cd 定位到Apache安装目录的bin目录下&#xff0c;输入httpd.exe -…

stm32 usmart使用

我直接用正点原子给的&#xff0c;步骤如下 先添加三个.c进工程&#xff0c;添加两个头文件的编译路径 #include "usart.h"#include "usmart.h" main函数里添加如下 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 uart_init(960…

Istio 1.15 发布,支持 arm64 架构处理器

Istio 是基于容器的云原生技术栈的三大核心技术之一&#xff0c;另外两个是 Kubernetes 和 Knative。其中 Kubernetes 和 Knative 早已支持了 arm64 架构&#xff0c;甚至连 Istio 的数据平面 Envoy 早在 1.16 版本 [1] 就已支持 arm64 架构&#xff08;2020 年 10 月&#xff…

TP框架表单验证 【包含ajax方法】

之前的表单验证都是用js写的&#xff0c;这里也可以使用tp框架的验证。但是两者比较而言还是js验证比较好&#xff0c;因为tp框架验证会运行后台代码&#xff0c;这样运行速度和效率就会下降。  自动验证是ThinkPHP模型层提供的一种数据验证方法&#xff0c;可以在使用create创…

Spring 入门学习二之IOC

今天来学习Spring ioc .一、spring jar 包导入 在 spring 官网下载开发包 spring-framework-4.2.4.RELEASE,然后导入需要的 jar 包到项目 /lib/ 目录下。 &#xfffc; 二、代码开发 新建一个 src/cn/sxt/bean/Hello.java文件 package cn.sxt.bean;/*** Created by kaiyiwang o…

java 物理内存_聊聊Java中的内存

JVM的内存先放一张JVM的内存划分图&#xff0c;总体上可以分为堆和非堆(粗略划分&#xff0c;基于java8)那么一个Java进程最大占用的物理内存为&#xff1a;Max Memory eden survivor old String Constant Pool Code cache compressed class space Metaspace Thread st…

.Net CoreRabbitMQ基本使用

队列模式https://www.rabbitmq.com/getstarted.html对以上几种模式进行简要分类&#xff0c;可以分成如下三类(RPC暂不考虑)简单队列模式&#xff0c;单发单收&#xff0c;一对一模式Worker模式&#xff0c;单发多收(一个消息一个接收者&#xff0c;多个消息多个接收者)&#x…