题面:洛谷传送门 BZOJ传送门

最大流神题

把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边

源点$S$向第$1$层的点连边,第$R+1$层的点向$T$连边,流量均为$inf$

跑最大流,最大流的流量就是答案

因为每条纵轴都取了最小的$v$,被割掉的边就是最小的$v$所在的边

然而题目里还有限制,相邻两个纵轴取值的位置相差的距离不能超过$D$

如何处理这个限制呢?

每个点$(i,j,k)$向$(x,y,k-D)$连流量为$inf$的边,$(x,y)$是$(i,j)$相邻的纵轴

假设纵轴$(i,j)$的割点是$(i,j,k)$

如果$(x,y)$的割点在$(x,y,k-D)$下面,一定会有一条流量从纵轴$(i,j)$流到$(x,y)$里,然后向上流到汇点$T$

巧妙地解决了距离的限制问题

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define N1 67010
 5 #define M1 400010
 6 #define L1 45
 7 using namespace std;
 8 const int inf=0x3f3f3f3f;
 9
10 int gint()
11 {
12     int ret=0,fh=1;char c=getchar();
13     while(c<'0'||c>'9'){if(c=='-')fh=-1;c=getchar();}
14     while(c>='0'&&c<='9'){ret=ret*10+c-'0';c=getchar();}
15     return ret*fh;
16 }
17 struct Edge{
18 int to[M1<<1],nxt[M1<<1],flow[M1<<1],head[N1],cte;
19 void ae(int u,int v,int f)
20 {
21     cte++; to[cte]=v; nxt[cte]=head[u];
22     head[u]=cte; flow[cte]=f;
23 }
24 }e;
25
26 int dep[N1],que[M1],cur[N1],n,m,h,D,hd,tl,S,T;
27 int bfs()
28 {
29     int x,j,v;
30     memset(dep,-1,sizeof(dep)); memcpy(cur,e.head,sizeof(cur));
31     hd=1,tl=0; que[++tl]=S; dep[S]=0;
32     while(hd<=tl)
33     {
34         x=que[hd++];
35         for(j=e.head[x];j;j=e.nxt[j])
36         {
37             v=e.to[j];
38             if( dep[v]==-1 && e.flow[j]>0 )
39             {
40                 dep[v]=dep[x]+1;
41                 que[++tl]=v;
42             }
43         }
44     }
45     return dep[T]!=-1;
46 }
47 int dfs(int x,int limit)
48 {
49     int j,v,flow,ans=0;
50     if(!limit||x==T) return limit;
51     for(j=cur[x];j;j=e.nxt[j])
52     {
53         v=e.to[j]; cur[x]=j;
54         if( dep[v]==dep[x]+1 && (flow=dfs(v,min(limit,e.flow[j]))) )
55         {
56             e.flow[j]-=flow; limit-=flow;
57             e.flow[j^1]+=flow; ans+=flow;
58             if(!limit) break;
59         }
60     }
61     return ans;
62 }
63 int Dinic()
64 {
65     int mxflow=0,j,v,ans=0;
66     while(bfs())
67         mxflow+=dfs(S,inf);
68     return mxflow;
69 }
70
71 int xx[4]={-1,0,1,0},yy[4]={0,1,0,-1};
72 int v[L1][L1][L1],id[L1][L1][L1];
73 inline int check(int x,int y){return (x<1||y<1||x>n||y>m)?0:1;}
74
75 int main()
76 {
77     scanf("%d%d%d%d",&n,&m,&h,&D);
78     int i,j,k,x,y,w,p; e.cte=1; S=0; T=n*m*(h+1)+1;
79     for(k=1;k<=h+1;k++) for(i=1;i<=n;i++) for(j=1;j<=m;j++) id[k][i][j]=(k-1)*n*m+(i-1)*m+j;
80     for(k=1;k<=h;k++) for(i=1;i<=n;i++) for(j=1;j<=m;j++)
81     {
82         w=v[k][i][j]=gint(), x=id[k][i][j];
83         e.ae(x,x+n*m,w), e.ae(x+n*m,x,0);
84         if(k<=D) continue;
85         //x+=n*m;
86         for(p=0;p<4;p++)
87         {
88             if(!check(i+xx[p],j+yy[p])) continue;
89             y=id[k-D][i+xx[p]][j+yy[p]];
90             e.ae(x,y,inf); e.ae(y,x,0);
91         }
92     }
93     for(i=1;i<=n;i++) for(j=1;j<=m;j++) e.ae(S,id[1][i][j],inf), e.ae(id[1][i][j],S,0);
94     for(i=1;i<=n;i++) for(j=1;j<=m;j++) e.ae(id[h+1][i][j],T,inf), e.ae(T,id[h+1][i][j],0);
95     printf("%d\n",Dinic());
96     return 0;
97 }

转载于:https://www.cnblogs.com/guapisolo/p/10350290.html

BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)相关推荐

  1. BZOJ 3144 [Hnoi2013]切糕

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

  2. bzoj 3144: [Hnoi2013]切糕

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

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

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

  4. 3144: [Hnoi2013]切糕

    3144: [Hnoi2013]切糕 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1526  Solved: 827 [Submit][Statu ...

  5. ●BOZJ 3144 [Hnoi2013]切糕

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

  6. 解题报告:POJ 3281 Dining(最大流 / “三分图”建图)

    B.POJ 3281 DiningDiningDining(最大流/建图模板)[省选/NOI- ] 有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一 种食物和一种饮料.现 ...

  7. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  8. [SCOI2007] 修车(费用流 + 差分时间段建图)

    problem luogu-P2053 solution 假设只有一个工作人员.修车顺序为 p1,p2,...,pnp_1,p_2,...,p_np1​,p2​,...,pn​ 是一个 nnn 的排列 ...

  9. bzoj-3144 [Hnoi2013]切糕

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

最新文章

  1. 解读Go语言的2018:怎么就在中国火成这样了?
  2. Go 语言编程 — 并发 — Goroutine 协程
  3. LeetCode算法题9:递归和回溯-N皇后问题
  4. 29、jdbc操作数据库(6)
  5. IOS ----UIButton用法详解
  6. 字符串查找字符出现次数_查找字符串作为子序列出现的次数
  7. QQ空间无法上传多张图片解决方案
  8. .Net 获取IP 地址和计算机名(本地网)
  9. bzoj 1656: [Usaco2006 Jan] The Grove 树木(BFS)
  10. 卷积神经网络问题总结
  11. 全球首列氢燃料混合动力有轨电车成功商业运营,全程“无网”运行
  12. 商场收银系统服务器安装在哪里,收银系统怎么安装?详细步骤分享
  13. 通过表面分析评估 Cu-CMP 工艺
  14. ubuntu 制作gif 动态图片
  15. Java小白 学习笔记(三)——面向对象
  16. From Intrusion Detection to Attacker Attribution: A Comprehensive Survey of Unsupervised Methods翻译
  17. C语言 AES加解密
  18. python二进制写入文件_python读写二进制文件的方法
  19. YOLO V1 论文精讲
  20. SDWebImage如何避免复用

热门文章

  1. Response 输出文件流过程中的等待效果
  2. C++语言map和unordered_map的下标操作
  3. ARM嵌入式开发之JTAG与SWD接口
  4. rsync文件实时同步_从文件同步rsync算法谈起
  5. 038_Steps步骤条
  6. Hyperledger Indy 理解
  7. dalsa线扫相机调试文档_线阵相机调试文档
  8. 第七章 oracle的服务启动顺序、认证方式、
  9. Windows 命令窗口(cmd)命令不能用解决办法
  10. java中super关键字_Java中关键字super与this的区别