3144: [Hnoi2013]切糕

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1526  Solved: 827
[Submit][Status][Discuss]

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

Source

经典最小割模型

题面简化为,一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d

求最小代价

每个格子拆出40个点

连同S与T用40种代价串起来

即 p(x,y,z)->p(x,y,z+1)边权f(x,y,z+1)

然后 p(x,y,z)->p(x’,y’,z-d)边权inf (x,y)与(x’,y’)相邻

把边画出来正确性很显然

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int read(){register int x=0;bool f=1;register char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return f?x:-x;
}
const int N=50;
const int M=N*N*N;
const int inf=2e9;
int n,m,S,T,head[M],dis[M],q[M*10];
bool vis[M];
int P,Q,R,D,mp[N][N][N],id[N][N][N],cnt;
struct node{int v,next,cap;
}e[M*10];int tot=1;
void add(int x,int y,int z){e[++tot].v=y;e[tot].cap=z;e[tot].next=head[x];head[x]=tot;e[++tot].v=x;e[tot].cap=0;e[tot].next=head[y];head[y]=tot;
}
bool bfs(){for(int i=S;i<=T;i++) dis[i]=inf;int h=0,t=1;q[t]=S;dis[S]=0;while(h!=t){int x=q[++h];for(int i=head[x];i;i=e[i].next){int v=e[i].v;if(e[i].cap&&dis[v]>dis[x]+1){dis[v]=dis[x]+1;if(v==T) return 1;q[++t]=v;}}}return dis[T]<inf;
}
int dfs(int x,int f){if(x==T) return f;int used=0,t;for(int i=head[x];i;i=e[i].next){int v=e[i].v;if(e[i].cap&&dis[v]==dis[x]+1){t=dfs(v,min(f,e[i].cap));e[i].cap-=t;e[i^1].cap+=t;used+=t;f-=t;if(!f) return used;}}if(!used) dis[x]=0;return used;
}
int dinic(){int res=0;while(bfs()) res+=dfs(S,inf);return res;
}
int main(){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",&mp[i][j][k]);id[i][j][k]=++cnt;}}}S=0,T=cnt+1;for(int i=1;i<=R;i++){for(int j=1;j<=P;j++){for(int k=1;k<=Q;k++){if(i==1)add(S,id[i][j][k],mp[i][j][k]);elseadd(id[i-1][j][k],id[i][j][k],mp[i][j][k]);if(i==R)add(id[i][j][k],T,inf);if(i>D){if(j!=1) add(id[i][j][k],id[i-D][j-1][k],inf);if(j!=P) add(id[i][j][k],id[i-D][j+1][k],inf);if(k!=1) add(id[i][j][k],id[i-D][j][k-1],inf);if(k!=Q) add(id[i][j][k],id[i-D][j][k+1],inf);}}}}printf("%d",dinic());return 0;
}

转载于:https://www.cnblogs.com/shenben/p/6261731.html

3144: [Hnoi2013]切糕相关推荐

  1. BZOJ 3144 [Hnoi2013]切糕

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

  2. BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)

    题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...

  3. bzoj 3144: [Hnoi2013]切糕

    Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...

  4. ●BOZJ 3144 [Hnoi2013]切糕

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3144 题解: "这是一个经典的最小割模型" ---引用自别人的博客 .. ...

  5. BZOJ.3144.[HNOI2013]切糕(最小割)

    题目链接 没有\(D\)的限制怎么做?"最小"我们可以想到最小割,把同一纵轴上的点串起来,分别连到S,T,最小割就是答案.(在这把点权放到前一条边上) 有限制,即如果要割点\(i\ ...

  6. bzoj-3144 [Hnoi2013]切糕

    3144 [Hnoi2013]切糕 题目链接 题目大意 给出一个立方体(长宽高分别P,Q,R),按三维坐标每个点记作(x,y,z),点权为V(x,y,z),对于x,y位置从上到下有z层,但只能选择一层 ...

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

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

  8. [HNOI2013]切糕

    题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...

  9. bzoj3144: [Hnoi2013]切糕(最小割)

    传送门 据说这玩意儿叫切糕模型? 我们可以看做有$P*Q$个网格,每个格子有$R$个点,在每一个格子中选一个点,且相邻的点距离不能超过$d$,求最小代价 考虑如果没有限制条件怎么做.我们可以把每一个网 ...

最新文章

  1. 如果你在2018面试前端,那这篇文章最好看一看!
  2. Java - 错误: quot;java.lang.ArrayIndexOutOfBoundsException: length=1; index=1quot;
  3. Foursquare开源Rogue和Full-Loaded两款开发工具
  4. linux svn磁盘空间满,Linux svn checkout时候总报设备上没有空间
  5. 【系统分析与设计】软件开发模式之敏捷开发(Scrum)分析
  6. 实时监控Cat之旅~配置Cat集群需要注意的问题
  7. 新建android项目导包,Cordova开发App入门(一)创建android项目
  8. 【转】ASP.NET 2.0 - 导航(Navigation)SiteMap导航菜单关系
  9. Android 实现手写板技术
  10. Batch批量替换hosts
  11. 关闭Oracle 11g的DPR特性
  12. “天天向上”力量的Python教学实例
  13. 程序员突然倒地!中软回应称系低血糖引发
  14. labview非线性曲线拟合Lorenz拟合
  15. 联想T460p加装固态硬盘
  16. 【毕业设计】答 辩 技 巧 一(以一个过来人的身份,祝各位答辩 过 过 过)
  17. 2021-09-24 网安实验-图像隐写-StegSolve之Frame Browser
  18. 5年多工作经验,工资给15k,要是你,你会接受吗?
  19. Unity_太阳月亮地球的自转公转脚本
  20. Android vs iOS 程序开发:我该选哪一个?

热门文章

  1. 关于go访问rabbitmq的连接池
  2. 一个关于if else容易迷惑的问题(转自鸟哥公众号)
  3. 利用机器学习进行金融数据风险评估
  4. Windows平台下的Redis集群搭建(简单有效)
  5. 泛型之类型擦除和桥接方法
  6. graph-easy使用简介
  7. Rand7()实现Rand10()
  8. SpringBoot邮件服务
  9. 同步工具之CyclicBarrier循环栅栏
  10. 云效(原RDC)+ 容器服务完成持续集成