「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 ...
随机推荐
- Oracle 利用执行计划来避免排序操作
在oracle中,利用index来避免排序 SQL) NOT NULL); SQL> CREATE INDEX IND_T_NOSORT_NAME ON T_NOSORT(NAME); SQL& ...
- [Kingdom Rush]团队分享:如何做塔防手游
转自:http://www.gamelook.com.cn/2015/03/207324 GameLook报道/2014年11月,乌拉圭开发商Ironhide Studios发布的<Kingdo ...
- MariaDB 脚本
研究MariaDB, 需要mock up一些假数据: 生成n个长度整型数的函数rand_num: CREATE DEFINER=`root`@`localhost` FUNCTION `rand_nu ...
- Android Intent Action 大全
1.Intent的用法: (1)Action跳转 1. 使用Action跳转,当程序AndroidManifest.xml中某一个 Activity的IntentFilter定义了包含Action,如 ...
- Python——string
字符串操作 string典型的内置方法: count() center() startswith() find() format() lower() upper() strip() replace() ...
- DRF之注册器响应器分页器
概要 url注册器 响应器 分页器 url注册器 通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下: 第一步:导入 ...
- thread.Join(); 让主线程等待自己完成
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Linux 学习笔记之 --- epoll 事件模型详解
epoll 主要采用对已就绪的 fd 进行轮询操作 一.epoll 触发方式 epoll支持 ET 和 LT 两种触发方式 ET(边缘触发):Nginx 就是采用 ET 触发方式,只支持 no-b ...
- Cable master(二分-求可行解)
Inhabitants of the Wonderland have decided to hold a regional programming contest. The Judging Commi ...
- 如何搭建自己的SPRING INITIALIZR server
这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...