链接:http://cogs.pro/cogs/problem/problem.php?pid=2398

题意:找到一个最小割使损失最小。

字面意思,单纯的最小割。对于每一个点$(i,j,k)$,我们将其与它下方的点$(i,j,k-1)$,连一条容量为该点不和谐度的边,如果高度为1,连到源点,高度为n,建出一条到汇点容量无限大的边。对于高度超过限制高度的点,我们由周围下方可行点向它连容量无限大边。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn=45,maxm=100005,inf=0x3f3f3f3f;
 7 int map[maxn][maxn][maxn],ord[maxn][maxn][maxn],p,q,r,cnt,S,T,d,fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
 8 struct node
 9 {
10     int from,to,flow,next;
11 }edge[maxm<<3];
12 int head[maxm],tot;
13 void addedge(int u,int v,int w)
14 {
15     edge[tot]=(node){u,v,w,head[u]};head[u]=tot++;
16     edge[tot]=(node){v,u,0,head[v]};head[v]=tot++;
17 }
18 #include<queue>
19 int dis[maxm],g[maxm];
20 bool bfs()
21 {
22     memset(dis,0,sizeof(dis));
23     dis[S]=1;
24     queue<int>q;q.push(S);
25     while(!q.empty())
26     {
27         int u=q.front();q.pop();
28         for(int i=head[u];i!=-1;i=edge[i].next)
29         {
30             int v=edge[i].to;
31             if(edge[i].flow>0&&!dis[v])
32             {
33                 dis[v]=dis[u]+1;
34                 q.push(v);
35             }
36         }
37     }
38     return dis[T];
39 }
40 int dfs(int pos,int flow)
41 {
42     if(pos==T||!flow)return flow;
43     int f=0;
44     for(int &i=g[pos];i!=-1;i=edge[i].next)
45     {
46         int v=edge[i].to;
47         if(dis[v]==dis[pos]+1&&edge[i].flow>0)
48         {
49             int t=dfs(v,min(flow,edge[i].flow));
50             if(t>0)
51             {
52                 flow-=t;f+=t;
53                 edge[i].flow-=t;
54                 edge[i^1].flow+=t;
55                 if(!flow)break;
56             }
57         }
58     }
59     return f;
60 }
61 int haha()
62 {
63     freopen("nutcake.in","r",stdin);
64     freopen("nutcake.out","w",stdout);
65     memset(head,-1,sizeof(head));
66     scanf("%d%d%d",&p,&q,&r);
67     scanf("%d",&d);
68     for(int i=1;i<=p;i++)
69         for(int j=1;j<=q;j++)
70             for(int k=1;k<=r;k++)ord[i][j][k]=++cnt;
71     S=0,T=cnt+1;
72     for(int k=1;k<=r;k++)
73         for(int i=1;i<=p;i++)
74             for(int j=1;j<=q;j++)
75             {
76                 int z;scanf("%d",&z);
77                 if(k==1)addedge(S,ord[i][j][k],z),addedge(ord[i][j][r],T,inf);
78                 else addedge(ord[i][j][k-1],ord[i][j][k],z);
79                 if(k>d)
80                     for(int l=0;l<4;l++)
81                     {
82                         int x=i+fx[l],y=j+fy[l];
83                         if(ord[x][y][k-d])addedge(ord[i][j][k],ord[x][y][k-d],inf);
84                     }
85             }
86     int ans=0;
87     while(bfs())
88     {
89         for(int i=S;i<=T;i++)g[i]=head[i];
90         ans+=dfs(S,T);
91     }
92     printf("%d\n",ans);
93 }
94 int sb=haha();
95 int main(){;}

cogs2398

转载于:https://www.cnblogs.com/Loser-of-Life/p/7262319.html

cogs2398 切糕 最小割相关推荐

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

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

  2. BZOJ.3144.[HNOI2013]切糕(最小割)

    题目链接 没有\(D\)的限制怎么做?"最小"我们可以想到最小割,把同一纵轴上的点串起来,分别连到S,T,最小割就是答案.(在这把点权放到前一条边上) 有限制,即如果要割点\(i\ ...

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

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

  4. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  5. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  6. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  7. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  8. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  9. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  10. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

最新文章

  1. 基于Debian9.3安装OpenVAS9.0(kali源)
  2. 如何生成存储器配置文件?
  3. IntelliJ IDEA 配置JDK出现The selected directory is not a valid home for JDK
  4. (解题报告)L1-032 Left-pad (20分)——15行代码AC
  5. spyder pyecharts不显示_我的显示器需要定时校色吗?
  6. VMware时钟不准的解决之道
  7. STL标准模板库操作 --- map
  8. ASP.NET调用WCF服务
  9. JAAS Authorization文档
  10. 锐起无盘服务器缓存,锐起无盘v0412(集成虚拟盘+SSD缓存+R2开包版)
  11. Python和R之间转换的基本指南:使用Python或R知识来有效学习另一种语言的简单方法。
  12. 求三点共圆求圆心半径及其推导(三角形外心)
  13. 文件怎么设置密码?一文带你看到文件加密的方法
  14. Python float()函数
  15. 我若为梦,愿为你织一帘幽然
  16. Mac 开发者常用的工具
  17. ESP8266 快速对接小爱同学 语音控制
  18. 荐书 | 睡不着?你需要这本神经漫游指南
  19. 中国自动驾驶专利申请排行榜
  20. 2022T电梯修理考试题及在线模拟考试

热门文章

  1. springboot+websocket聊天室(私聊+群聊)
  2. GPRS附着,PDP激活失败
  3. 服务器响应302是什么意思,HTTP 状态中的 301 和 302 是什么意思?二者有何不同?...
  4. TongWeb卡、TongWeb卡、TongWeb卡卡卡
  5. windows/linux远程开关机原理及实现
  6. 计算机windows用户名密码怎么查,如何查看Windows和Office的密码、序列号
  7. office2016激活后仍然出现输入激活码
  8. springboot后端接受图片到本地
  9. 对大数据、云计算的联系和区别理解学习
  10. 柴静《看见》发布会。。。