BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
题面:洛谷传送门 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]切糕 (最大流+巧妙的建图)相关推荐
- BZOJ 3144 [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵 ...
- bzoj 3144: [Hnoi2013]切糕
Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x, ...
- BZOJ.3144.[HNOI2013]切糕(最小割)
题目链接 没有\(D\)的限制怎么做?"最小"我们可以想到最小割,把同一纵轴上的点串起来,分别连到S,T,最小割就是答案.(在这把点权放到前一条边上) 有限制,即如果要割点\(i\ ...
- 3144: [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1526 Solved: 827 [Submit][Statu ...
- ●BOZJ 3144 [Hnoi2013]切糕
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3144 题解: "这是一个经典的最小割模型" ---引用自别人的博客 .. ...
- 解题报告:POJ 3281 Dining(最大流 / “三分图”建图)
B.POJ 3281 DiningDiningDining(最大流/建图模板)[省选/NOI- ] 有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一 种食物和一种饮料.现 ...
- PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!
文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...
- [SCOI2007] 修车(费用流 + 差分时间段建图)
problem luogu-P2053 solution 假设只有一个工作人员.修车顺序为 p1,p2,...,pnp_1,p_2,...,p_np1,p2,...,pn 是一个 nnn 的排列 ...
- bzoj-3144 [Hnoi2013]切糕
3144 [Hnoi2013]切糕 题目链接 题目大意 给出一个立方体(长宽高分别P,Q,R),按三维坐标每个点记作(x,y,z),点权为V(x,y,z),对于x,y位置从上到下有z层,但只能选择一层 ...
最新文章
- 解读Go语言的2018:怎么就在中国火成这样了?
- Go 语言编程 — 并发 — Goroutine 协程
- LeetCode算法题9:递归和回溯-N皇后问题
- 29、jdbc操作数据库(6)
- IOS ----UIButton用法详解
- 字符串查找字符出现次数_查找字符串作为子序列出现的次数
- QQ空间无法上传多张图片解决方案
- .Net 获取IP 地址和计算机名(本地网)
- bzoj 1656: [Usaco2006 Jan] The Grove 树木(BFS)
- 卷积神经网络问题总结
- 全球首列氢燃料混合动力有轨电车成功商业运营,全程“无网”运行
- 商场收银系统服务器安装在哪里,收银系统怎么安装?详细步骤分享
- 通过表面分析评估 Cu-CMP 工艺
- ubuntu 制作gif 动态图片
- Java小白 学习笔记(三)——面向对象
- From Intrusion Detection to Attacker Attribution: A Comprehensive Survey of Unsupervised Methods翻译
- C语言 AES加解密
- python二进制写入文件_python读写二进制文件的方法
- YOLO V1 论文精讲
- SDWebImage如何避免复用