●BOZJ 3144 [Hnoi2013]切糕
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=3144
题解:
"这是一个经典的最小割模型" ---引用自别人的博客
。。。。。。。。。。。。。
苦酒入喉心作痛,我怎么就是建不出图呢?
先考虑部分限制:
1).每个纵轴上只选择一个点。
这个建图比较简单,如下,(把点权放在它上方的边上):
(x,y,z) –> (x,y,z+1) : (w[x][y][z])
只用求一个最小割即可。
另外,再添加另一个限制:
2).相邻的纵轴上选择的点的竖直距离不超过D(假设 D=1)
(x,y,z) –> (x',y',z-D ) : (INF) (x,y)与(x',y'相邻)
这个就只有 kou nao dai 了。。。
因为在上图中每条路上只割一条边。
那么假设在左边的路上割了 E1。
那么显然,只能在右边的路上割黄色区域。
如果建一条绿边(竖直向下D个单位)的话,显然右边黄色区域下面的边就割不了了。
那么又是如何限制黄色区域的上界的呢。
考虑如果选择割了右边黄色区域上面的某一条边 E2,
那类似绿边那样的建一条蓝色的边,
显然这无法形成一个割,因为存在可继续增广的路。
所以为了形成最下割,在右边的选择区域就固定在了黄色区域里。
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 100050
#define MAXM 1000050
#define INF 0x3f3f3f3f
using namespace std;
const int mv[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct Edge{int to[MAXM],cap[MAXM],nxt[MAXM],head[MAXN],ent;void Init(){ent=2;}void Adde(int u,int v,int w){to[ent]=v; cap[ent]=w; nxt[ent]=head[u]; head[u]=ent++;to[ent]=u; cap[ent]=0; nxt[ent]=head[v]; head[v]=ent++;}int Next(int i,bool type){return type?head[i]:nxt[i];}
}E;
int d[MAXN],cur[MAXN];
int P,Q,R,D,S,T;
int idx(int x,int y,int z){return P*Q*(z-1)+(x-1)*Q+y;
}
bool bfs(){queue<int>q; int u,v;memset(d,0,sizeof(d));q.push(S); d[S]=1;while(!q.empty()){u=q.front(); q.pop();for(int i=E.Next(u,1);i;i=E.Next(i,0)){v=E.to[i];if(d[v]||!E.cap[i]) continue;d[v]=d[u]+1; q.push(v);}}return d[T];
}
int dfs(int u,int reflow){if(u==T||!reflow) return reflow;int flowout=0,f,v;for(int &i=cur[u];i;i=E.Next(i,0)){v=E.to[i];if(d[v]!=d[u]+1) continue;f=dfs(v,min(reflow,E.cap[i]));flowout+=f; E.cap[i^1]+=f;reflow-=f; E.cap[i]-=f;if(!reflow) break;}if(!flowout) d[u]=0;return flowout;
}
int Dinic(){int flow=0;while(bfs()){memcpy(cur,E.head,sizeof(E.head));flow+=dfs(S,INF);}return flow;
}
int main()
{E.Init();scanf("%d%d%d%d",&P,&Q,&R,&D);S=P*Q*R+1; T=P*Q*R+2;for(int k=1,x,_i,_j,to;k<=R;k++)for(int i=1;i<=P;i++)for(int j=1;j<=Q;j++){ scanf("%d",&x);if(k==R) to=T; else to=idx(i,j,k+1);E.Adde(idx(i,j,k),to,x);if(k-D<=0) continue;for(int l=0;l<4;l++){_i=i+mv[l][0];_j=j+mv[l][1];if(_i<1||P<_i||_j<1||Q<_j) continue;E.Adde(idx(i,j,k),idx(_i,_j,k-D),INF);}}for(int i=1;i<=P;i++)for(int j=1;j<=Q;j++)E.Adde(S,idx(i,j,1),INF);int ans=Dinic();printf("%d",ans);return 0;
}
转载于:https://www.cnblogs.com/zj75211/p/7931437.html
●BOZJ 3144 [Hnoi2013]切糕相关推荐
- BZOJ 3144 [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵 ...
- 3144: [Hnoi2013]切糕
3144: [Hnoi2013]切糕 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1526 Solved: 827 [Submit][Statu ...
- BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
题面:洛谷传送门 BZOJ传送门 最大流神题 把点权转化为边权,切糕里每个点$(i,j,k)$向$(i,j,k+1)$连一条流量为$v(i,j,k)$的边 源点$S$向第$1$层的点连边,第$R+1$ ...
- 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\ ...
- bzoj-3144 [Hnoi2013]切糕
3144 [Hnoi2013]切糕 题目链接 题目大意 给出一个立方体(长宽高分别P,Q,R),按三维坐标每个点记作(x,y,z),点权为V(x,y,z),对于x,y位置从上到下有z层,但只能选择一层 ...
- 【BZOJ3144】[Hnoi2013]切糕 最小割
[BZOJ3144][Hnoi2013]切糕 Description Input 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q ...
- [HNOI2013]切糕
题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...
- bzoj3144: [Hnoi2013]切糕(最小割)
传送门 据说这玩意儿叫切糕模型? 我们可以看做有$P*Q$个网格,每个格子有$R$个点,在每一个格子中选一个点,且相邻的点距离不能超过$d$,求最小代价 考虑如果没有限制条件怎么做.我们可以把每一个网 ...
最新文章
- 没有绝对安全的系统!激光瞄准二极管,25米外从被物理隔绝的计算机中窃取数据...
- python图片比对、自动化测试,腾讯优图及知脸(ZKface)人脸比对接口测试(python)
- 我是怎么保存公众号历史文章合集到本地的?当然是用python了!
- [转载] 七龙珠第一部——第002话 布玛没有尾巴
- 如何检测链表中是存在循环
- 【C++基础】异常匹配与内建异常类
- 使用记事本写java程序并编译运行过程
- 【iOS开发】理解Action、IBACtion、Action Connection
- .Net 4.0 之 Dynamic 动态类型
- 365RSS.cn = Web3.0?
- 阿里云盘内测申请_阿里云网盘开放内测申请,网盘行业又成香饽饽了?
- 碰到 oracle 10g ORA-00257
- Debug无忧!清华校友打造Python调试神器!
- SEO的关键字分析的浅析
- H-Index H指数
- b、B、kb、kB单位
- 【Mathtype】安装Mathtype后,word无法粘贴的问题
- 原始LBP/Uniform LBP编程实现与直方图
- 猫猫学IOS(四)UI之半小时搞定Tom猫
- 盘点那些免费好用的高清录屏软件,7款宝藏软件(2023年新版)