题目链接:戳我

最小割的一种常见模型。
题目可以转化为:给定一个立方体,它被分成pqr个格子,每个格子中都有一个数字,相邻地选择数字,每一行每一列都要选择一个数字。要求这些数字和最小。

建图就是建r+1层,然后这些边的权值是对应位置的数字权值。从每一个点(第z层)向它旁边四个纵轴连一条指向第z-d层的有向边(这样可以限制旁边纵轴上选择的点的层数>=z-d,但是我们想要的是在>=z-d的同时还<=z+d。这个不用担心,因为它旁边的纵轴也会有和它同样的操作连上去有向边,在层数>z+d的时候,它通过指向>z的点的有向边依然可以流向汇点——所以说这样就限制住了层数)。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define S 0
#define T cnt+1
#define MAXN 100010
#define INF 0x3f3f3f3f
using namespace std;
int P,Q,R,t=1,d,cnt;
int head[MAXN],dep[MAXN],cur[MAXN],sum[50][50][50],id[50][50][50];
struct Edge{int nxt,to,dis;}edge[MAXN<<1];inline void add(int from,int to,int dis)
{edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t;edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=0;head[to]=t;
}inline bool bfs()
{queue<int>q;memset(dep,0x3f,sizeof(dep));memcpy(cur,head,sizeof(head));q.push(S);dep[S]=0;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(dep[v]==0x3f3f3f3f&&edge[i].dis)dep[v]=dep[u]+1,q.push(v);}}if(dep[T]==0x3f3f3f3f) return false;return true;
}inline int dfs(int x,int f)
{if(!f||x==T) return f;int w,used=0;for(int i=cur[x];i;i=edge[i].nxt){int v=edge[i].to;cur[x]=i;if(dep[v]==dep[x]+1&&(w=dfs(v,min(f,edge[i].dis)))){edge[i].dis-=w,edge[i^1].dis+=w;used+=w,f-=w;if(!f) break;}}return used;
}inline int dinic()
{int cur_ans=0;while(bfs()) cur_ans+=dfs(S,INF);return cur_ans;
}int main()
{#ifndef ONLINE_JUDGEfreopen("ce1.in","r",stdin);#endifscanf("%d%d%d",&P,&Q,&R);for(int z=1;z<=R+1;z++)for(int x=1;x<=P;x++)for(int y=1;y<=Q;y++)id[x][y][z]=++cnt;scanf("%d",&d);for(int z=1;z<=R;z++)for(int x=1;x<=P;x++)for(int y=1;y<=Q;y++)scanf("%d",&sum[x][y][z]);for(int z=1;z<=R+1;z++){for(int x=1;x<=P;x++){for(int y=1;y<=Q;y++){if(z==1) add(S,id[x][y][z],INF);//printf("[%d,%d] %d\n",S,id[x][y][z],INF);if(z==R+1) add(id[x][y][z],T,INF);//printf("[%d,%d] %d\n",id[x][y][z],T,INF);else add(id[x][y][z],id[x][y][z+1],sum[x][y][z]);//printf("[%d,%d] %d\n",id[x][y][z],id[x][y][z+1],sum[x][y][z]);if(z>d) {if(y+1<=Q) add(id[x][y][z],id[x][y+1][z-d],INF);//printf("[%d,%d] %d\n",id[x][y][z],id[x][y+1][z-d],INF);if(y-1>=1) add(id[x][y][z],id[x][y-1][z-d],INF);//printf("[%d,%d] %d\n",id[x][y][z],id[x][y-1][z-d],INF);if(x+1<=P) add(id[x][y][z],id[x+1][y][z-d],INF);//printf("[%d,%d] %d\n",id[x][y][z],id[x+1][y][z-d],INF);if(x-1>=1) add(id[x][y][z],id[x-1][y][z-d],INF);//printf("[%d,%d] %d\n",id[x][y][z],id[x-1][y][z-d],INF);}}}}printf("%d\n",dinic());return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10364618.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. 第五章ThinkingInJava
  2. 超干货!一位博士生80篇机器学习相关论文及笔记下载
  3. 对URLEncode的解码
  4. iOS传感器之气压计的使用
  5. 哈根达斯发布违法广告被罚1万 用代可可脂冒充巧克力
  6. LeetCode Algorithm 7. 整数反转
  7. 在字典中根据条件来筛选数据
  8. springboot整合canal
  9. .NET DateTime,一个关于最佳实践和时间旅行的故事
  10. Mike Novogratz:比特币在未来几年内将继续大幅上涨
  11. 投资一个五星级酒店需要多钱?多长时间能回本?
  12. cookie与session的比较
  13. java openfileoutput_java-openFileOutput在单例类中不能正常工作-想...
  14. [转]: GB2312-80区位编码表
  15. Vue.use 写多个_支付宝为16个行业写的文案,据说价值30万
  16. 植物大战僵尸辅助C/C++版
  17. 获取U盘 VID,PID
  18. 要闻君说:华为与故宫携手共建智慧紫禁城;央视315曝光瞄准大数据黑市;华为官宣称自己也有操作系统了;美国夸口启动6G研发?...
  19. Oracle递归死循环怎么办?
  20. Excel.cpp和Excel.h的获取

热门文章

  1. error: implicit declaration of function ‘RAND_egd’ [-Werror=implicit-function-declaration]
  2. 下载xerces.jar链接
  3. 编译OpenJDK12:globalDefinitions_visCPP.hpp(46): fatal error C1083:inttypes.h No such file or directory
  4. 辛辛苦苦做了几天白忙活,错在哪里?
  5. 也谈谈古代一两银子相当于今天的价格
  6. python生成exe文件太大了_Pyinstaller打包生成exe文件过大,四种常用处理方法集锦---嵌入式Python-02...
  7. C# 置顶EXE 把EXE放最前面 ProcessStartInfo
  8. Opencv图像数据结构剖析
  9. nanopc t3开发板系统烧录_基础教程18 定制 Arduino 系统
  10. 基于linux的进程调度模拟程序,2011180021_Linux操作系统_课程设计报告_基于Linux的进程调度模拟程序...