「HNOI2013」切糕
题目链接
\(Solution\)
对于这道题,我们首先来看看没有\(D\)这个约束的该如何做。
我们考虑构造最小割模型。
其实直接贪心就好了,选出每条路径上的最小值就好了(路径就是将每层的同一个点连起来)
但是因为这题不仅仅是这样,还有一些约束条件需要满足。所以还是看看如何建模吧。
其实和贪心很像啊。
首先如上面所说连成一条条路径,在将第一层和\(S\)相连,最后一层和\(T\)连接。跑一遍最小割就好了。至于流量,这个自己应该知道吧,如果不知道来看看图,更加深刻的理解。(这里只选了局部图,有点丑)
首先我们将第\(k\)层第\(i\)行,第\(j\)列的数的值设为\(V[k][i][j]\)

现在考虑一下\(D\)的约束条件
我们可以对于一个点,令他为\((k,x,y)\),我们可以将点x连向\(k-D\)层中与\((x,y)\)相邻的点,流量为\(inf\),这样就可以满足条件了,至于为什么来借助图来看一下吧。
假设现在\(D=1\),如图:

我们将\(i\)点到\(j\)点的边表示为\(f[i][j]\)
我们首先的思考一下,每一条链只能割一条边,因为如果割多条明显不会最优。假设我们现在割的是\(f[6][8]\)这一条边,那么我们就不能割\(f[S][1]\),我们将\((6,1)\)连一条为\(inf\)的边我这样当我们割掉是\(f[6][8]\),则这一条道路走不通我们就会走\(f[6][1]\)因为要满足最优,所以我们一定不会割\(f[S][1]\),其他的同理。
\(Code\)
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*f;
}
struct node{
int to,next,v;
}a[200001];
int head[100001],cnt,n,m,s,t,x,y,z,dep[100001];
void add(int x,int y,int c){
a[++cnt].to=y,a[cnt].next=head[x],a[cnt].v=c,head[x]=cnt;
a[++cnt].to=x,a[cnt].next=head[y],a[cnt].v=0,head[y]=cnt;
}
queue<int> q;
int bfs(){
memset(dep,0,sizeof(dep));
q.push(s);
dep[s]=1;
while(!q.empty()){
int now=q.front();
q.pop();
for(int i=head[now];i;i=a[i].next){
int v=a[i].to;
if(!dep[v]&&a[i].v>0)
dep[v]=dep[now]+1,q.push(v);
}
}
if(dep[t])
return 1;
return 0;
}
int dfs(int k,int list){
if(k==t||!list)
return list;
for(int i=head[k];i;i=a[i].next){
int v=a[i].to;
if(dep[v]==dep[k]+1&&a[i].v>0){
int p=dfs(v,min(list,a[i].v));
if(p){
a[i].v-=p;
if(i&1)
a[i+1].v+=p;
else a[i-1].v+=p;
return p;
}
}
}
dep[k]=0;
return 0;
}
int Dinic(){
int ans=0,k;
while(bfs())
while((k=dfs(s,inf)))
ans+=k;
return ans;
}
int V[50][50][50],vis[50][50][50];
int fx[5]={0,1,-1,0,0};
int fy[5]={0,0,0,1,-1};
int main(){
int P=read(),Q=read(),R=read(),D=read(),tot=0;
t=P*Q*R+1;
for(int k=1;k<=R;k++)
for(int i=1;i<=P;i++)
for(int j=1;j<=Q;j++)
V[k][i][j]=read(),vis[k][i][j]=++tot;
for(int k=D+1;k<=R;k++)
for(int i=1;i<=P;i++)
for(int j=1;j<=Q;j++)
for(int z=1;z<=4;z++){
x=i+fx[z],y=j+fy[z];
if(x<1||x>P||y<1||y>Q) continue;
add(vis[k][i][j],vis[k-D][x][y],inf);
}
for(int k=2;k<=R;k++)
for(int i=1;i<=P;i++)
for(int j=1;j<=Q;j++)
add(vis[k-1][i][j],vis[k][i][j],V[k][i][j]);
for(int i=1;i<=P;i++)
for(int j=1;j<=Q;j++)
add(s,vis[1][i][j],V[1][i][j]),add(vis[R][i][j],t,inf);
printf("%d",Dinic());
}
「HNOI2013」切糕的更多相关文章
- 「题解」「HNOI2013」切糕
文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...
- 【LOJ】#2384. 「HNOI2013」切糕
题解 神仙网络流啊-- naive的我一直想把每个纵轴拆点,每个纵轴建R个点(大概是要跑费用流吧--)--然后第二个限制就gg了,什么也想不出来,菜啊TAT 后来我发现大神们的建图都是,一个原点,一个 ...
- BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型
问题描述 BZOJ3144 LG3227 还想粘下样例 输入: 2 2 2 1 6 1 6 1 2 6 2 6 输出: 6 题解 关于离散变量模型,我不想再抄一遍,所以: 对于样例,可以建立出这样的图 ...
- 「HNOI2013」游走
「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...
- Solution -「HNOI2013」消毒
弱化一下,先考虑在二维上解决问题. 题目就转化为:有 \(n\) 个点 \((i, j)\) 需要被覆盖,而我们每次可以选一行或一列去覆盖,求覆盖所有点的最少选择次数. 如果我们对于每一个 \((i, ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
随机推荐
- Centos 6.5 安装Oracle 11g R2 on vbox
由于上一篇的rac安装,截图较多,这一篇选择以txt的方式叙述,另外上一篇的时间比较久远,这里最近从新安装 --2018-10-29 1 os环境初始化 [root@rac1 yum.repos.d] ...
- linux lcd设备驱动剖析一
s3c2440 lcd驱动源码文件是:drivers/video/s3c2410fb.c 看驱动源码首先当然是先看入口函数,这里是s3c2410fb_init函数 [cpp] view plain? ...
- String to Integer (atoi) ???
#define INT_MAX 2147483647 #define INT_MIN -2147483648 class Solution { public: int atoi(const char ...
- a标签的四个伪类是什么?如何排序?为什么?
爱恨分明原则: l v h a 注释:为了产生预期的效果,在 CSS 定义中,a:hover 必须位于 a:link 和 a:visited 之后 ! 注释:为了产生预期的效果,在 CSS 定义中,a ...
- 关于XSS漏洞的简介以及分类
不得不说注入的时代已经过去了,最近xss貌似比较热门.我就去恶补了一下,我表示我只是菜鸟,对xss不了解.所以从最基本的学起. 什么xss漏洞? 一.XSS攻击简介 作为一种HTML注入攻击,XSS攻 ...
- js中,清空对象(删除对象的属性)
在项目中,有些对象用完后需要重置,下面简单介绍下JS中清除对象的方法.方法如下: 方法一:字面量定义对象 第一步,定义一个空对象并打印出来,代码和效果: 代码: var student = {};co ...
- bash shell笔记2 结构化命令
二.使用结构化命令 知识内容: # 改变命令流 # 使用if-then逻辑 # 嵌套if-then # 测试条件 # 高级if-then功能 许多程序在脚本命令之间需要某些逻辑控制流,有些命令允许脚本 ...
- 设备控制接口ioctl详解
[转]Linux设备控制接口 序言设备驱动程序的一个基本功能就是管理和控制设备,同时为用户应用程序提供管理和控制设备的接口.我们前面的“Hello World”驱动程序已经可以提供读写功能了,在这里我 ...
- 03-nginx虚拟主机配置
不想用kill命令控制nginx也行,但是其他命令没有信号的命令丰富.重读配置文件不用重启nginx(软重启).完全可以使用stop(强制退出).quick(优雅退出).reopen(重新打开日志). ...
- 玩转Mysql命令
连接数据库mysql -hlocalhost -uroot -p 在MYsql的跟目录文件下进行 show databses:展示所有数据库 解决方法1:在MySql安装目录下找到my.ini,将[m ...