问题描述

BZOJ3144

LG3227

还想粘下样例

输入:

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

输出:

6

题解

关于离散变量模型,我不想再抄一遍,所以:

对于样例,可以建立出这样的图

这是一个最小割模型,哪条边满流就代表在这个位置选择了哪个值。

网络流的主要思想就是通过点互化,将限制条件在边上体现出来。

所以比 \([1,r]\) 要再多建立一个点,但是最后增加的一层不能建立横向边


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; const int maxn=42;
const int INF=0x3f3f3f3f; int p,q,r,D;
int v[maxn][maxn][maxn]; int Head[maxn*maxn*maxn*2],Next[maxn*maxn*maxn*10],to[maxn*maxn*maxn*10],w[maxn*maxn*maxn*10],tot=1; int S,T;
void add(int x,int y,int z){
// if(x==4&&y==S) puts("Warning!");
// if(x==S&&y==4) puts("Warning!");
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
} int id(int x,int y,int z){
return (z-1)*p*q+(x-1)*q+y;
} void Init(void){
scanf("%d%d%d%d",&p,&q,&r,&D);
for(int i=1;i<=r;i++){
for(int j=1;j<=p;j++){
for(int k=1;k<=q;k++){
scanf("%d",&v[j][k][i]);
}
}
}
} int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0}; bool check(int x,int y,int z){
return ((x>=1&&x<=p)&&(y>=1&&y<=q)&&(z>=1&&z<=r));
} void Graph_build(void){
S=p*q*(r+1)+2,T=S+1;
for(int i=1;i<=p;i++){
for(int j=1;j<=q;j++){
add(S,id(i,j,1),INF);add(id(i,j,1),S,0);
for(int k=1;k<=r;k++){
add(id(i,j,k),id(i,j,k+1),v[i][j][k]);
add(id(i,j,k+1),id(i,j,k),0);
// add(id(i,j,k),id(i,j,k-1),v[i][j][k-1]);
// add(id(i,j,k-1),id(i,j,k),0);
}
add(id(i,j,r+1),T,INF);add(T,id(i,j,r+1),0);
}
}
for(int i=1;i<=p;i++){
for(int j=1;j<=q;j++){
for(int e=0;e<4;e++){
int mx=i+dx[e],my=j+dy[e];
if(mx<1||mx>p||my<1||my>q) continue;
for(int h=D+1;h<=r;h++){
add(id(i,j,h),id(mx,my,h-D),INF);
add(id(mx,my,h-D),id(i,j,h),0);
}
}
}
}
} int ans;
int d[maxn]; bool bfs(void){
memset(d,0,sizeof(d));
queue<int>q;q.push(S);d[S]=1;
while(q.size()){
int x=q.front();q.pop();
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(d[y]||!w[i]) continue;
d[y]=d[x]+1;q.push(y);
if(y==T) return true;
}
}
return false;
} int dfs(int x,int flow){
if(x==T) return flow;
int rest=flow;
for(int i=Head[x];i&&rest;i=Next[i]){
int y=to[i];
if(d[y]!=d[x]+1||!w[i]) continue;
int k=dfs(y,min(rest,w[i]));
if(!k) d[y]=0;
else w[i]-=k,w[i^1]+=k,rest-=k;
}
return flow-rest;
} void Dinic(void){
int t;
while(bfs()){
while(t=dfs(S,INF)) ans+=t;
}
} void Dbug(){
for(int i=2;i<=tot;i+=2){
printf("%d %d %d\n",to[i^1],to[i],w[i]);
}
} //#define debug void Work(void){
Graph_build(); #ifdef debug
Dbug();
printf("S:%d T:%d\n",S,T);
#endif
Dinic();
printf("%d\n",ans);
} int main(){
Init();
Work();
return 0;
}

BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型的更多相关文章

  1. TopCoder12727 「SRM590Hard」FoxAndCity 最小割离散变量模型

    问题描述 一张 \(N\) 个点无向图,边权都为 \(1\) ,添加若干条边,最小化 \(\sum\limits_{1 \le i \le n,i \in N_{+}}{(a_i-b_i)^2}\). ...

  2. 「题解」「HNOI2013」切糕

    文章目录 「题解」「HNOI2013」切糕 题目描述 思路分析及代码 题目分析 题解及代码 「题解」「HNOI2013」切糕 题目描述 点这里 思路分析及代码 题目分析 这道题的题目可以说得上是史上最 ...

  3. 【LOJ】#2384. 「HNOI2013」切糕

    题解 神仙网络流啊-- naive的我一直想把每个纵轴拆点,每个纵轴建R个点(大概是要跑费用流吧--)--然后第二个限制就gg了,什么也想不出来,菜啊TAT 后来我发现大神们的建图都是,一个原点,一个 ...

  4. 「HNOI2013」切糕

    题目链接 戳我 \(Solution\) 对于这道题,我们首先来看看没有\(D\)这个约束的该如何做. 我们考虑构造最小割模型. 其实直接贪心就好了,选出每条路径上的最小值就好了(路径就是将每层的同一 ...

  5. Codechef RIN 「Codechef14DEC」Course Selection 最小割离散变量模型

    问题描述 提供中文版本好评,一直以为 Rin 是题目名字... pdf submit 题解 参考了 东营市胜利第一中学姜志豪 的<网络流的一些建模方法>(2016年信息学奥林匹克中国国家队 ...

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

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

  7. 「HNOI2013」游走

    「HNOI2013」游走 题目描述 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) .小 \(Z\) 在该图上进行随机游走,初始时小 \(Z\) 在 \ ...

  8. 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型

    最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那 ...

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

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

随机推荐

  1. 进程-(process)、线程-(Thread)

    进程和线程之间的区别: 内存之间的区别: 进程之间不可以共享内存空间,每个进程都有各自独立的内存空间: 线程之间则是可以共享一个进程里的内存空间: 通信机制方面的区别 默认情况下,进程之间很难互通的, ...

  2. 201871010119-帖佼佼《面向对象程序设计(java)》第十四周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  3. COCI 2012 Inspektor

    coci 2012 inspektor 街道由左到右分布着\(N\)个办公室,编号为\(1\)到\(N\),最开始,每个办公室都是空的,一些公司将入住,并赶走办公室里面现有的公司.一人每天会路过一些连 ...

  4. VS2019 开发Django(八)------视图

    导航:VS2019开发Django系列 这几天学习了一下Django的视图和模板,从这几天的学习进度来看,视图这里并没有花很多的时间,相反的,模板花费了大量的时间,主要原因还是因为对Jquery操作d ...

  5. 955 不加班的公司名单:955.WLB

    前两天说到,韩老师的 Github 总 star 数量超过了 20000!全球排名第 232! 他,TypeScript GitHub Star 上海第一,全国第四!GitHub 总标星超两万! 其实 ...

  6. 多个 .NET 框架

    目录 应用程序编程接口 C# 和 .NET 版本控制 .NET Standard 目前存在多个 .NET 框架. Microsoft 的宗旨是在最大范围的操作系统和硬件平台上提供 .NET 实现. 下 ...

  7. HA Joker Vulnhub Walkthrough

    下载地址: https://www.vulnhub.com/entry/ha-joker,379/ 主机扫描: ╰─ nmap -p- -sV -oA scan 10.10.202.132Starti ...

  8. Cesium专栏-terrain地形、3dtiles模型、gltf模型 高度采样

    在Cesium中,对于terrain地形.3dtiles模型.gltf模型的高度采样是一个很基本的功能,基于此,可以做一些深度应用,而Cesium已经帮我们提供了相应的API,在这里,我帮大家总结一下 ...

  9. Dynamics 365 Portal 修改注册页面及Profile页面

    一,Profile页面 客户要求在Portal Profile页面上添加性别字段,通过查看源代码发现,中间的联系人信息部分是引用的CRM中Contact实体的Portal Web Form表单,直接把 ...

  10. Django的Form验证

    Django的Form验证 Form验证:Form提交Form表单数据验证 针对Form提交的数据进行验证 创建模板 class loginForm() 请求提交给模板,创建对象 obj=loginF ...