3144: [Hnoi2013]切糕

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1495  Solved: 819
[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

分析:

限制距离模型:

可以把题意看成有p*q个网格,每个网格有r个点,要在每个格子中选一个点,并且相邻的格子选择的点距离不超过d,求最小代价...

考虑如果没有距离限制怎么建图...把每个格子拆成r个点,串成一条链和ST相连,求最小割就是答案...

现在有了距离限制...怎么办??最常用的限制方法就是添加容量为+∞的边...

我们把(i,j,k)向(i',j',k-d)(相邻的格子)连边...这个正确性画一下图YY一下就好...

代码:

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. //by NeighThorn
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8.  
  9. const int maxn=+,maxm=+;
  10.  
  11. int n,m,h,d,S,T,cnt,hd[maxn],fl[maxm],to[maxm],nxt[maxm],pos[maxn];
  12.  
  13. int mv[][]={,,,-,,,-,};
  14.  
  15. inline bool bfs(void){
  16. memset(pos,-,sizeof(pos));
  17. int head=,tail=,q[maxn];
  18. q[]=S,pos[S]=;
  19. while(head<=tail){
  20. int top=q[head++];
  21. for(int i=hd[top];i!=-;i=nxt[i])
  22. if(pos[to[i]]==-&&fl[i])
  23. pos[to[i]]=pos[top]+,q[++tail]=to[i];
  24. }
  25. return pos[T]!=-;
  26. }
  27.  
  28. inline int find(int v,int f){
  29. if(v==T)
  30. return f;
  31. int res=,t;
  32. for(int i=hd[v];i!=-&&f>res;i=nxt[i])
  33. if(pos[to[i]]==pos[v]+&&fl[i])
  34. t=find(to[i],min(fl[i],f-res)),res+=t,fl[i]-=t,fl[i^]+=t;
  35. if(!res)
  36. pos[v]=-;
  37. return res;
  38. }
  39.  
  40. inline int dinic(void){
  41. int res=,t;
  42. while(bfs())
  43. while(t=find(S,inf))
  44. res+=t;
  45. return res;
  46. }
  47.  
  48. inline void add(int s,int x,int y){
  49. fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
  50. fl[cnt]=;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
  51. }
  52.  
  53. signed main(void){
  54. // freopen("in.txt","r",stdin);
  55. memset(hd,-,sizeof(hd));
  56. scanf("%d%d%d%d",&n,&m,&h,&d);
  57. S=,T=n*m*h+;
  58. for(int k=,x;k<=h;k++)
  59. for(int i=;i<=n;i++)
  60. for(int j=;j<=m;j++){
  61. scanf("%d",&x);
  62. if(k==)
  63. add(x,S,((i-)*m+j-)*h+k);
  64. else
  65. add(x,((i-)*m+j-)*h+k-,((i-)*m+j-)*h+k);
  66. if(k==h)
  67. add(inf,((i-)*m+j-)*h+k,T);
  68. }
  69. for(int i=;i<=n;i++)
  70. for(int j=;j<=m;j++)
  71. for(int k=d+;k<=h;k++)
  72. for(int t=;t<;t++){
  73. int x=i+mv[t][],y=j+mv[t][];
  74. if(x>=&&x<=n&&y>=&&y<=m)
  75. add(inf,((i-)*m+j-)*h+k,((x-)*m+y-)*h+k-d);
  76. }
  77. printf("%d\n",dinic());
  78. return ;
  79. }//Cap ou pas cap. Cap.

By NeighThorn

BZOJ 3144: [Hnoi2013]切糕的更多相关文章

  1. bzoj 3144: [Hnoi2013]切糕 最小割

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 681  Solved: 375[Submit][Status] ...

  2. [BZOJ 3144] [Hnoi2013] 切糕 【最小割】

    题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...

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

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

  4. 【刷题】BZOJ 3144 [Hnoi2013]切糕

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

  5. bzoj 3144 [Hnoi2013]切糕——最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 一根纵轴上切一个点,可以把一根纵轴上的点连成一串来体现.自己的写法是每个点连向前一个点 ...

  6. 洛谷 P3227 BZOJ 3144 [HNOI2013]切糕

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

  7. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  8. bzoj 3144 [Hnoi2013]切糕【最小割+dinic】

    都说了是'切'糕所以是最小割咯 建图: 每个点向下一层连容量为这个点的val的边,S向第一层连容量为inf的边,最后一层向T连容量为自身val的边,即割断这条边相当于\( f(i,j) \)选择了当前 ...

  9. 【BZOJ 3144】 3144: [Hnoi2013]切糕 (最小割模型)

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1764  Solved: 965 Description Inp ...

随机推荐

  1. 重磅来袭,使用CRL实现大数据分库分表方案

    关于分库分表方案详细介绍 http://blog.csdn.net/bluishglc/article/details/7696085 这里就不作详细描述了 分库分表方案基本脱离不了这个结构,受制于实 ...

  2. java监控之ManagementFactory分析

    The ManagementFactory class is a factory class for getting managed beans for the Java platform. This ...

  3. YYModel 源码解读(二)之NSObject+YYModel.h (1)

    本篇文章主要介绍 _YYModelPropertyMeta 前边的内容 首先先解释一下前边的辅助函数和枚举变量,在写一个功能的时候,这些辅助的东西可能不是一开始就能想出来的,应该是在后续的编码过程中 ...

  4. Troubleshooting:重新安装Vertica建库后无法启动

    环境:RHEL6.5 + Vertica7.1.0-3 1.故障现象 2.重装集群 3.再次定位 4.解决问题 5.总结 1.故障现象 故障现象:Vertica集群安装成功,但是创建数据库后一直无法u ...

  5. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(3): 抓取amazon.com价格

    通过上一篇随笔的处理,我们已经拿到了书的书名和ISBN码.(网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(2): 抓取allitebooks.com书籍信息 ...

  6. [WinForm] DataGridView 绑定 DT && ComboBox 列绑定 Dict

    一  需求介绍 一般像枚举类型的数据,我们在数据库里存储着诸如(1.2.3.4-)或者("001"."002"."003"-)此类,但是界面 ...

  7. QML 从无到有 (基础)

    小公司,没办法,什么都得自己亲自来. 服务端是MVC,现在需要可PC客户端和移动APP. 考虑到网页应用有很多界面框架,可以做出很漂亮的界面来,就尝试着使用nwjs来实现,可是在使用了2天的nwjs后 ...

  8. 图表插件Charts.js的使用

    Charts.js的介绍自行百度 首先下载Charts.js,官网:http://chartjs.cn/ charts.js 托管在了github上,下载下来后加解压出src中的文件即可.其中有cha ...

  9. JavaMail发送邮件第一版

    首先,我们先来了解一个基本的知识点,用什么工具来发邮件? 简单的说一下,目前用的比较多的客户端:OutLook,Foxmail等 顺便了解一下POP3.SMTP协议的区别: POP3,全名为" ...

  10. JQ的表单验证

    (function () { $("#but").click(function () { if ($("#name").val() == "" ...