洛谷P3227 切糕
最小割模板。
题意:你要在一个三维点阵的每个竖条中删去一个点,使得删去的点权和最小。
且相邻(四联通)的两竖条之间删的点的z坐标之差的绝对值不超过D。
解:
首先把这些都串起来,点边转化,就变成最小割了对吧。
那么限制条件怎么处理呢?
我们知道在最小割中流量为INF的边是割不断的,以此来连边,使得相邻的割点超过D不合法。
具体来说:把相邻的两条链中,差距刚好为D的点连起来。从上往下连INF。
这是D = 1的一个连边实例。

可以发现,我们割两个在同一高度的边是没问题的。
如果高度相差1也没问题。
如果左边的高2格,那么会被红色的边限制;如果右边的高2格又会被蓝色的边限制。
所以这样连边就能够满足限制条件了。
然后跑最小割即可。
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring> const int N = , M = , INF = 0x3f3f3f3f;
const int dx[] = {, , -, };
const int dy[] = {, , , -}; struct Edge {
int nex, v, c;
}edge[M << ]; int top = ; int e[N], d[N], m, n;
std::queue<int> Q; inline void add(int x, int y, int z) {
top++;
edge[top].v = y;
edge[top].c = z;
edge[top].nex = e[x];
e[x] = top; top++;
edge[top].v = x;
edge[top].c = ;
edge[top].nex = e[y];
e[y] = top;
return;
} inline bool BFS(int s, int t) {
memset(d, , sizeof(d));
d[s] = ;
Q.push(s);
while(!Q.empty()) {
int x = Q.front();
Q.pop();
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i].c || d[y]) {
continue;
}
d[y] = d[x] + ;
Q.push(y);
}
}
return d[t];
} int DFS(int x, int t, int maxF) {
if(x == t) {
return maxF;
}
int ans = ;
for(int i = e[x]; i; i = edge[i].nex) {
int y = edge[i].v;
if(!edge[i].c || d[x] + != d[y]) {
continue;
}
int temp = DFS(y, t, std::min(edge[i].c, maxF - ans));
if(!temp) {
d[y] = INF;
}
ans += temp;
edge[i].c -= temp;
edge[i ^ ].c += temp;
if(ans == maxF) {
break;
}
}
return ans;
} inline int solve(int s, int t) {
int ans = ;
while(BFS(s, t)) {
ans += DFS(s, t, INF);
}
return ans;
} inline int id(int x, int y, int z) {
return z * n * m + (x - ) * m + y;
} int main() {
int r, D, x;
scanf("%d%d%d%d", &n, &m, &r, &D);
for(int k = ; k <= r; k++) {
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
scanf("%d", &x);
add(id(i, j, k - ), id(i, j, k), x);
}
}
}
int s = n * m * (r + ) + ;
int t = s + ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
for(int k = D; k <= r; k++) {
for(int dir = ; dir < ; dir++) {
x = i + dx[dir];
int y = j + dy[dir];
if(x && y && x <= n && y <= m) {
add(id(i, j, k), id(x, y, k - D), INF);
}
}
}
add(s, id(i, j, ), INF);
add(id(i, j, r), t, INF);
}
} int ans = solve(s, t);
printf("%d", ans);
return ;
}
AC代码
洛谷P3227 切糕的更多相关文章
- 洛谷 P3227 BZOJ 3144 [HNOI2013]切糕
题目描述 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你能帮她找出最好的切割方案 ...
- [洛谷P3227][HNOI2013]切糕
题目大意:有一个$n\times m$的切糕,每一个位置的高度可以在$[1,k]$之间,每个高度有一个代价,要求四联通的两个格子之间高度最多相差$D$,问可行的最小代价.$n,m,k,D\leqsla ...
- 【洛谷 P3227】 [HNOI2013]切糕(最小割)
题目链接 每层每个位置向下一层这个位置连边,流量为下一层这个位置的\(f\),源点向第一层连,流量第一层每个位置的费用,最后一层向汇点连,流量\(INF\). 这样就得到了\(P*Q\)条链,不考虑\ ...
- 洛谷 P3227 [HNOI2013]切糕(最小割)
题解 Dinic求最小割 题目其实就是求最小的代价使得每个纵轴被分成两部分 最小割!!! 我们把每个点抽象成一条边,一个纵轴就是一条\(S-T\)的路径 但是题目要求\(|f(x,y)-f(x',y' ...
- 洛谷$P3227\ [HNOI2013]$切糕 网络流
正解:网络流 解题报告: 传送门! 日常看不懂题系列,,,$QAQ$ 所以先放下题目大意趴$QwQ$,就说有个$p\cdot q$的矩阵,每个位置可以填一个$[1,R]$范围内的整数$a_{i,j}$ ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- 20155207 实验5 MSF基础应用
20155207 实验5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:让攻击方式能够发挥作用的通道,更像是没有子弹的枪,提供了攻击方 ...
- 20155328 《网络对抗》 实验九 Web安全
20155328 <网络对抗> 实验九 Web安全 基础 实验过程记录 在实验开始之前先把webgoat的jar包放到home目录下.打开终端,用命令java -jar webgoat-c ...
- 备忘:BLOCK CORRUPTION IN SYSTEM DATAFILE
http://www.onlinedbasupport.com/2010/12/10/block-corruption-in-system-datafile/
- 汇编 shr 逻辑右移指令,shl 逻辑左移指令,SAL 算术左移指令,SAR 算术右移指令
知识点: shr 逻辑右移指令 shl 逻辑左移指令 一.SHL 逻辑左移指令测试 shr 逻辑右移指令 右移一位相当于整除2 shl 逻辑左移指令 左移一位相当于乘2 //很多时候会溢出 //& ...
- Python学习之路(一)之Python基础1
目录 Python基础初识 1.Python介绍 1.1.Python简介 1.2.Python特点 1.3.Python应用领域 1.4.Python解释器的种类 2.Python基础初识 2.1. ...
- C#对战小游戏,持续更新(里面暂无内容,标记插眼)
做的乱七八糟的 很明显的一点,对集合.数组.类的理解和运用 很差.很差.很差 今儿不做了,马德,头都肿大了 休息一下,捋一捋
- 177. Convert Sorted Array to Binary Search Tree With Minimal Height【LintCode by java】
Description Given a sorted (increasing order) array, Convert it to create a binary tree with minimal ...
- 自己动手写Impala UDF
本文由 网易云发布. 概述 出于对可扩展性和性能的考虑,UDF已变成大数据生态圈查询引擎的必备功能之一,无论是Calcite.Hive.Impala都对其进行支持,但是UDF的支持有利也有弊,好处在 ...
- 通过监控Nginx日志来实时屏蔽高频恶意访问的IP
目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚 ...
- PAT甲题题解-1073. Scientific Notation (20)-字符串处理
题意:给出科学计数法的格式的数字A,要求输出普通数字表示法,所有有效位都被保留,包括末尾的0. 分两种情况,一种E+,一种E-.具体情况具体分析╮(╯_╰)╭ #include <iostrea ...