【HNOI2013】切糕

Sample Input

2 2 2
1
6 1
6 1
2 6
2 6

Sample Output

6

\(P,Q,R≤40,0≤D≤R\)

参考:https://blog.csdn.net/zarxdy34/article/details/45272055

经典的有距离限制的网络流模型。

首先我们不考虑高度限制。我们直接将图建\(r+1\)层,就是每个格子\((x,y)\)拆成\(r+1\)个点。将它们串成一串,第\(i\)层的向\(i+1\)层连边,第\(i\)条边的容量就是\(v_{x,y,i}\)。然后源点向第\(1\)层的连边,第\(r+1\)层的向汇点连边。最小割就是答案。

考虑怎么将距离限制表示出来。对于所有的格子\((x,y)\),假设是第\(k\)层的图,那么我们向第\(k-d\)层的\((x,y)\)周围的点连\(\infty\)的边。

考虑这么做的合法性。两个相邻的格子\((x,y),(x',y')\),如果我们选了\(v_{x,y,k}\),也就是割断了第\(k\)层\((x,y)\)连出去的边,那么\((x',y')\)选的高度\(k'\)要\(\geq k-D\)。如果\((x',y')\)割断了\(k-D\)以下的边,那么\((x,y)\)和\((x',y')\)之间\(\infty\)的边就会实源点和汇点连通。

代码:

#include<bits/stdc++.h>
#define ll long long
#define N 45using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}const int V=N*N*N;
int n,m,r;
int D;
int v[N][N][N];
int id[N][N];
struct road {int to,next;int flow;
}s[V<<3];
int h[V],cnt=1;
void add(int i,int j,int f) {s[++cnt]=(road) {j,h[i],f};h[i]=cnt;s[++cnt]=(road) {i,h[j],0};h[j]=cnt;
}
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};int S,T;
int dis[V];
queue<int>q;
bool bfs() {memset(dis,0x3f,sizeof(dis));q.push(S);dis[S]=0;while(!q.empty()) {int v=q.front();q.pop();for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(s[i].flow&&dis[to]>dis[v]+1) {dis[to]=dis[v]+1;q.push(to);}}}return dis[T]<1e9;
}int dfs(int v,int maxf) {if(v==T) return maxf;int ret=0;for(int i=h[v];i;i=s[i].next) {int to=s[i].to;if(s[i].flow&&dis[to]==dis[v]+1) {int dlt=dfs(to,min(maxf,s[i].flow));s[i].flow-=dlt;s[i^1].flow+=dlt;ret+=dlt;maxf-=dlt;if(!maxf) return ret;}}return ret;
}int dinic() {int ans=0;while(bfs()) {while(1) {int tem=dfs(S,1e9);if(!tem) break;ans+=tem;}}return ans;
}int main() {n=Get(),m=Get(),r=Get();D=Get();for(int k=1;k<=r;k++)for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)v[i][j][k]=Get();int tot=n*m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)id[i][j]=(i-1)*m+j;T=(r+1)*tot+1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)add(S,id[i][j],1e9),add(id[i][j]+r*tot,T,1e9);for(int k=1;k<=r;k++) {for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++) {add((k-1)*tot+id[i][j],k*tot+id[i][j],v[i][j][k]);if(k>D) {int nxt=k-D;for(int d=0;d<4;d++) {int a=i+dx[d],b=j+dy[d];if(a<1||a>n||b<1||b>m) continue ;add((k-1)*tot+id[i][j],(nxt-1)*tot+id[a][b],1e9);}}}}}cout<<dinic();return 0;
}

转载于:https://www.cnblogs.com/hchhch233/p/10607390.html

【HNOI2013】切糕相关推荐

  1. BZOJ 3144 [Hnoi2013]切糕

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

  2. 3144: [Hnoi2013]切糕

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

  3. 【BZOJ3144】[Hnoi2013]切糕 最小割

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

  4. bzoj-3144 [Hnoi2013]切糕

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

  5. [HNOI2013]切糕

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

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

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

  7. bzoj 3144: [Hnoi2013]切糕

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

  8. bzoj3144: [Hnoi2013]切糕(最小割)

    传送门 据说这玩意儿叫切糕模型? 我们可以看做有$P*Q$个网格,每个格子有$R$个点,在每一个格子中选一个点,且相邻的点距离不能超过$d$,求最小代价 考虑如果没有限制条件怎么做.我们可以把每一个网 ...

  9. bzoj3144 [Hnoi2013]切糕

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

  10. [HNOI2013] 切糕

    2019独角兽企业重金招聘Python工程师标准>>> 有一个n*m*h的切糕,你需要给所有n*m条纵轴确定一个切点(x,y,z),表示切掉坐标为(x,y,z)的点.规定相邻的纵轴不 ...

最新文章

  1. 在iOS中使用tableView
  2. python3 pip 报错 pip is configured with locations that require TLS/SSL
  3. SELinux与SEAndroid
  4. 在Linux下常用的命令
  5. ORACLE查询表数据占用存储空间大小
  6. 重拾强化学习的核心概念_强化学习的核心概念
  7. 3秒搞定!~~ 一亿数据获取前100个最大值
  8. oracle中affirm,2.Oracle Data Guard 参数介绍
  9. 计算机excel素材,excel操作练习题素材.doc
  10. 工具:Wind金融终端使用指南
  11. 如何在自定义Filter中优雅的实现静态资源放行
  12. 分享咖啡基础知识——从咖啡小白到咖啡发烧友需要了解的那些事儿!
  13. 那个80后程序员,7年创业4次,公司市值750亿美金,全球5万员工!
  14. 贝叶斯算法(bayesian)在反垃圾邮件中的应用
  15. SAP PO的结算状态
  16. 吴海燕C语言真题,基于APP的智能婴儿床系统的设计与实现开题报告
  17. 面试常见问题之OWASP top10
  18. cocos2dx+java部落战争全套游戏源码资源策划文档
  19. 【手机建站】Android Termux+cpolar内网穿透,搭建外网可以访问的网站
  20. matlab里如何输入圆周,用MATLAB实现序列的圆周卷积

热门文章

  1. 理解常用的无理数:自然常数(e)、圆周率(π)、黄金比例(φ)
  2. 康托尔点集matlab实数,康托尔集是什么。详细解释
  3. zigbee抓包时为何时常出现这个not able to setup connection to device smartRF04EB
  4. Exception loading sessions from persistent storage+ClassNotFoundException
  5. 12306春运火车票抢票攻略——3分钟抢到热门票
  6. 微软五笔调出,中英文切换快捷键
  7. 相比于深度学习,传统的机器学习算法难道就此没落了吗,还有必要去学习吗?
  8. html语言中alt,html中alt的用法
  9. *sql注入实战--记一次绕过WTS-WAF拦截注入**
  10. 店宝宝:电视剧“拼刀刀”梗引热议 拼多多紧急注册商标为哪版?