题目传送门


题目大意

\(P\)行\(Q\)列的楼房高度均为\(R\),每一层改造要花费一定的金钱,

每个楼房都要挑选有且仅有一层进行改造,并且相邻两个楼房改造位置的相对高度不能超过\(D\),

问最小花费


分析

原题目更能看出是最小割,但是这样题意更能懂一些,

可以建一个分层图,建一个虚拟层,这样把点换为边,

接着源点连第一层,虚拟层连汇点,容量无穷大

但是相对高度怎么搞,就是让它割不掉嘛

若两个点\((x_1,y_1),(x_2,y_2)\)相邻,

那么\((x_1,y_1,k)\)与\((x_2,y_2,k+D)\)连一条边,容量无穷大,就好了


代码

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <queue>
  4. #define rr register
  5. using namespace std;
  6. const int inf=1e7,N=66011;
  7. struct node{int y,w,next;}e[N*11];
  8. const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
  9. int ls[N],dis[N],P,Q,R,D,ans,s,t,k=1; bool v[N];
  10. inline signed iut(){
  11. rr int ans=0,f=1; rr char c=getchar();
  12. while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
  13. while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
  14. return ans*f;
  15. }
  16. inline void add(int x,int y,int w){
  17. e[++k]=(node){y,w,ls[x]}; ls[x]=k;
  18. e[++k]=(node){x,0,ls[y]}; ls[y]=k;
  19. }
  20. inline signed bfs(int s){
  21. for (rr int i=1;i<=t;++i) dis[i]=0;
  22. queue<int>q; q.push(s); dis[s]=1;
  23. while (q.size()){
  24. rr int x=q.front(); q.pop();
  25. for (rr int i=ls[x];i;i=e[i].next)
  26. if (e[i].w>0&&!dis[e[i].y]){
  27. dis[e[i].y]=dis[x]+1;
  28. if (e[i].y==t) return 1;
  29. q.push(e[i].y);
  30. }
  31. }
  32. return 0;
  33. }
  34. inline signed dfs(int x,int now){
  35. if (x==t||!now) return now;
  36. rr int rest=0,f;
  37. for (rr int i=ls[x];i;i=e[i].next)
  38. if (e[i].w>0&&dis[e[i].y]==dis[x]+1){
  39. rest+=(f=dfs(e[i].y,min(now-rest,e[i].w)));
  40. e[i].w-=f; e[i^1].w+=f;
  41. if (now==rest) return rest;
  42. }
  43. if (!rest) dis[x]=0;
  44. return rest;
  45. }
  46. signed main(){
  47. P=iut(),Q=iut(),R=iut(),
  48. D=iut(),s=P*Q*(R+1)+1,t=s+1;
  49. for (rr int i=1;i<=R;++i)
  50. for (rr int j=1;j<=P;++j)
  51. for (rr int k=1;k<=Q;++k)
  52. add((i*P+j-P-1)*Q+k,(i*P+j-1)*Q+k,iut());
  53. for (rr int i=1;i<=P;++i)
  54. for (rr int j=1;j<=Q;++j)
  55. add(s,(i-1)*Q+j,inf),add((R*P+i-1)*Q+j,t,inf);
  56. for (rr int i=1;i<=P;++i)
  57. for (rr int j=1;j<=Q;++j)
  58. for (rr int u=0;u<4;++u){
  59. rr int x=i+dx[u],y=j+dy[u];
  60. if (x<1||x>P||y<1||y>Q) continue;
  61. for (rr int h=D;h<=R;++h)
  62. add((h*P+i-1)*Q+j,(h*P-D*P+x-1)*Q+y,inf);
  63. }
  64. while (bfs(s)) ans+=dfs(s,inf);
  65. return !printf("%d",ans);
  66. }

#网络流,dinic,最小割#洛谷 3227 [HNOI2013]切糕的更多相关文章

  1. 洛谷 P3227 [HNOI2013]切糕(最小割)

    题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...

  2. 洛谷$P3227\ [HNOI2013]$切糕 网络流

    正解:网络流 解题报告: 传送门! 日常看不懂题系列,,,$QAQ$ 所以先放下题目大意趴$QwQ$,就说有个$p\cdot q$的矩阵,每个位置可以填一个$[1,R]$范围内的整数$a_{i,j}$ ...

  3. [洛谷P3227][HNOI2013]切糕

    题目大意:有一个$n\times m$的切糕,每一个位置的高度可以在$[1,k]$之间,每个高度有一个代价,要求四联通的两个格子之间高度最多相差$D$,问可行的最小代价.$n,m,k,D\leqsla ...

  4. 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)

    [BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...

  5. 【CF331E】Biologist(网络流,最小割)

    [CF331E]Biologist(网络流,最小割) 题面 洛谷 翻译: 有一个长度为\(n\)的\(01\)串,将第\(i\)个位置变为另外一个数字的代价是\(v_i\). 有\(m\)个要求 每个 ...

  6. 【BZOJ1391】Order(网络流,最小割)

    [BZOJ1391]Order(网络流,最小割) 题面 BZOJ权限题... 良心洛谷 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成 ...

  7. 【BZOJ3144】切糕(网络流,最小割)

    [BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...

  8. [bzoj1497][NOI2006]最大获利_网络流_最小割

    最大获利 bzoj-1497 题目大意:可以建立一个点,花费一定的代价:将已经建立的两个点之间连边,得到一定收益.有些节点之间是不允许连边的. 注释:1<=点数<=5,000,1<= ...

  9. [TJOI2013]攻击装置(网络流,最小割)

    前言 网络流被hbx吊起来打 Solution 考虑一下这个走法是不是和象棋中马的走法一模一样(废话) 那么显然我每一次移动是走三次,如果将棋盘二分图染色一下,不就是每一次只能走到另一个颜色的吗? 然 ...

  10. [bzoj2561]最小生成树_网络流_最小割_最小生成树

    最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...

随机推荐

  1. FFmpeg开发笔记(十一):ffmpeg在移植到海思HI35xx平台之将ffmpeg库引入到sample的demo中

    前言   上一篇交叉编译了ffmpeg的海思版本,使用交叉编译的qt的ffmpeg播放器在海思上播放,本片是将ffmpeg的环境添加进海思的sample环境中.   在海思sample中引入ffmpe ...

  2. 【Azure Developer】CURL 发送Oauth2 Token请求获取到 404 Not Found 问题

    问题描述 当使用 Postman 向AAD 发送如下请求时候,得到了404 Not Found的错误. "curl --location --request POST 'https://lo ...

  3. C#多线程(7):手动线程通知

    目录 区别与示例 ManualResetEvent 类 ManualResetEventSlim 区别与示例 AutoResetEvent 和 ManualResetEvent 十分相似.两者之间的区 ...

  4. Vue3学习(二十一)- 文档管理页面布局修改

    写在前面 按照国际惯例,要先聊下生活,吐槽一番,今天是2月14日,也是下午听老妈说,我才知道! 现在真的是对日期节日已经毫无概念可言,只知道星期几. 现在已经觉得写博客也好,学习文章也罢,和写日记一样 ...

  5. java获取kafka consumer lag、endOffsets、beginningOffsets以及 KafkaConsumer总结

    一.java获取kafka consumer lag.endOffsets.beginningOffsets maven依赖: <dependency> <groupId>or ...

  6. Java 常用类 String的常用方法(2)

    1 /** 2 * String 常用方法(2) 3 * boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束 4 * boolean startsWith ...

  7. Java 类中属性的使用

    1 类中属性的使用: 2 * 属性(成员变量) 局部变量 3 * 1.相同点: 4 * 定义变量的个格式: 数据类型 变量名 = 变量值 5 * 先声明 后使用 6 * 变量都有其对应的作用域 7 * ...

  8. Java //输入两个正整数m和n,求其最大的公约数和最小公倍数//12和20的最大公约数是4,最小公倍数是60

    1 //输入两个正整数m和n,求其最大的公约数和最小公倍数 2 //12和20的最大公约数是4,最小公倍数是60 3 4 Scanner scan = new Scanner(System.in); ...

  9. pycharm/Intellij idea双击打不开,没有反应,下列方法亲测有用!

    第一种方法: 看看你的微软C++运行库是不是误删了.....我就这么干过...以前有个软件捆绑这个 安装了 结果我后来给删了 ,导致我pycharm 和intellij idea全都打不开 !!!各位 ...

  10. [学习笔记]在CentOS7中用Docker方式安装Jenkins

    @ 目录 原理: 创建Docker网桥网络 安装DinD 创建镜像 构建镜像 运行容器 原理: Docker in Docker (以下简称 DinD)可以在 Container 中直接运行一个 Do ...