Link:

BZOJ 3144 传送门

Solution:

发现要把点集分成不连通的两部分,最小割的模型还是很明显的

首先我们将原图转化为$R+1$层,从而将点权化为边权

关键还是在于建图是怎么保证$|h_i-h_j|<=D$这个条件

要保证$|h_i-h_j|<=D$这个条件也就意味着选了$i$就不能选$j$,但仍然要保证$i->j$的连通性

于是我们由$i+D$向$i$连一条边权为$INF$的边,

这样如果割掉$i,j(j>i+D)$但不选择它们之间的边,就不会影响ST的连通性

只能再割掉$INF$边或其他边,这样两边同时选择明显不会计入答案

同时$i,j(j<=i+D)$就不会出现这样的问题,于是通过设置$INF$边就解决了这个问题

如上图,如果仅割掉右侧绿边和左侧红边,中间黑色的$INF$边仍会保持ST的连通性

Code:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int MAXN=**;
  6. const int INF=;
  7. int P,Q,R,D,S,T,id[][][],iter[MAXN],level[MAXN],cnt=,x;
  8. int dx[]={,,,-},dy[]={,-,,};
  9. struct edge
  10. {
  11. int to,cap,rev;
  12. };
  13. vector<edge> G[MAXN];
  14.  
  15. void add_edge(int from,int to,int cap)
  16. {
  17. G[from].push_back(edge{to,cap,G[to].size()});
  18. G[to].push_back(edge{from,,G[from].size()-});
  19. }
  20.  
  21. bool bfs()
  22. {
  23. memset(level,-,sizeof(level));
  24. queue<int> que;que.push(S);level[S]=;
  25. while(!que.empty())
  26. {
  27. int v=que.front();que.pop();
  28. for(int i=;i<G[v].size();i++)
  29. {
  30. edge &e=G[v][i];
  31. if(e.cap && level[e.to]==-)
  32. level[e.to]=level[v]+,que.push(e.to);
  33. }
  34. }
  35. return (level[T]>);
  36. }
  37.  
  38. int dfs(int v,int f)
  39. {
  40. if(v==T) return f;
  41. for(int &i=iter[v];i<G[v].size();i++)
  42. {
  43. edge &e=G[v][i];
  44. if(level[e.to]==level[v]+ && e.cap)
  45. {
  46. int d=dfs(e.to,min(f,e.cap));
  47. if(d)
  48. {
  49. e.cap-=d;G[e.to][e.rev].cap+=d;
  50. return d;
  51. }
  52. }
  53. }
  54. return ;
  55. }
  56.  
  57. int Dinic()
  58. {
  59. int ret=;
  60. while(bfs())
  61. {
  62. memset(iter,,sizeof(iter));
  63. int f;
  64. while((f=dfs(S,INF))>) ret+=f;
  65. }
  66. return ret;
  67. }
  68.  
  69. int main()
  70. {
  71. scanf("%d%d%d%d",&P,&Q,&R,&D);
  72. S=;
  73. for(int i=;i<=R+;i++) for(int j=;j<=P;j++) for(int k=;k<=Q;k++) //预处理出编号
  74. id[i][j][k]=++cnt;
  75. T=++cnt;
  76.  
  77. for(int i=;i<=R;i++) for(int j=;j<=P;j++) for(int k=;k<=Q;k++)
  78. scanf("%d",&x),add_edge(id[i][j][k],id[i+][j][k],x);
  79.  
  80. for(int i=;i<=P;i++) for(int j=;j<=Q;j++)
  81. add_edge(S,id[][i][j],INF),add_edge(id[R+][i][j],T,INF);
  82.  
  83. for(int i=D+;i<=R+;i++) for(int j=;j<=P;j++) for(int k=;k<=Q;k++)
  84. for(int dir=;dir<;dir++)
  85. {
  86. int fx=j+dx[dir],fy=k+dy[dir];
  87. if(!id[i-D][fx][fy]) continue;
  88. add_edge(id[i][j][k],id[i-D][fx][fy],INF);
  89. }
  90.  
  91. printf("%d",Dinic());
  92. return ;
  93. }

Review:

1、认真审题,不要主观带入

这题一开始想成了切割线必须在同一个平面,还是不能读题时自己想当然啊

2、最小割模型的新套路

最小割的重点便在于割边计入答案

如果不想让两条边同时计入答案,可以在它们之间加入一条$INF$边,

保证同时选择两边时不会影响原图ST的连通性且$INF$边不会影响结果

使得同时选择两边时一定不符合最小的条件,从而不会计入答案

3、点权变边权

可以通过点变边,边变点的方式完成这样的转换

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

  1. BZOJ 3144 切糕(最小割)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3144 题意: 思路:我们假设没有那个D的限制.这样就简 单了.贪心的话,我们只要在每一个 ...

  2. bzoj 3144 切糕 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3144 每个点拆成 R 个,连成一条链,边上是权值,割掉代表选这一层: 然后每个点的第 t 层 ...

  3. BZOJ 3144 切糕 最小割

    题意: 一个矩阵,每个格子分配一个数,不同的数字,代价不同,要求相邻格子数字差小等于d 求最小代价. 分析: 我猜肯定有人看题目就想到最小割了,然后一看题面理科否决了自己的这个想法…… 没错,就是最小 ...

  4. [BZOJ 3144][HNOI 2013] 切糕

    题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...

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

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

  6. BZOJ 3144: [Hnoi2013]切糕

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

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

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

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

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

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

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

随机推荐

  1. Intellij Idea debug 远程部署的的tomcat项目

    web项目部署到tomcat上之后,有时需要打断点单步调试,如果用的是Intellij idea,可以通过如下方法实现: 开启debug端口,启动tomcat 以tomcat7.0.75为例,打开bi ...

  2. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) C

    C. Little Artem and Matrix time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  3. [codechef MEXDIV]Mex division

    题目链接:https://vjudge.net/contest/171650#problem/I 直接用set+dp水过去了... /* 设dp[i]表示前i个做划分满足条件的方案数 有一个显然的转移 ...

  4. bzoj 1110 [POI2007]砝码Odw 贪心+进制转化

    [POI2007]砝码Odw Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 661  Solved: 366[Submit][Status][Disc ...

  5. oracle获取主机服务器IP

    --要获取服务器端的IP :: SYS@XXX> select utl_inaddr.get_host_address from dual; GET_HOST_ADDRESS --------- ...

  6. JavaScript获取HTML元素样式的方法(style、currentStyle、getComputedStyle)

    一.style.currentStyle.getComputedStyle的区别 style只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. currentStyle可以弥补st ...

  7. 封装常用的Javascript跨浏览器方法

    var EventUntil={ // 跨浏览器的添加事件方法 addHandler:function(element,type,handler){ if(element.addEventListen ...

  8. ByteUtil 工具类

    ByteUtil 工具类 import java.io.FileOutputStream; import java.io.OutputStream; import java.nio.charset.C ...

  9. 链接oracle数据库 生成表对应的javabean

    package com.databi.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOExc ...

  10. jsp中的路径问题

    在学jsp的时候我每次都遇到路径的问题,每次都不能够说100%的把这搞定,这让我很烦恼,今天下午花了点时间来把路径问题整理了下. 一:首先我们在加载项目(我的项目名称是FinalExam)是的路径是h ...