- 本质是线性规划
最小割建模
NOI2010 海拔
- 一个
的网格,每跳变的两个方向都有一定数目的人流,每个格点都有海拔,一个人爬坡需要付出高度差的代价,下坡不付出代价,左下角高度为
,右上角高度为
,求安排其它点盖度最小化总代价。
对偶图+Dijikstra
调整法证明高度一定是01且构成一个割。
TCO Semifinal Colorful Tree
- 一个DAG,保证边
一定满足
,且边的区间一定只存在包含不存在相交,每个点都有一个颜色,每种颜色要不全都经过要不全都不经过,边有边权,求最短路
边区间不相交构成一棵树,其实就是原图对偶图,最短路转化为最小割,
连若干inf边保证同色点在一边,向父亲连inf保证形态。
最大权闭合子图
有
个物品,每个物品有一个价值
(可负),你需要选出一个物品的集
合,最大化其中物品的总价值,并满足个限制
:选了
就必须选
择。
正价值物品与
连边,负价值物品与
连边,使用容量无穷的边来限制选
了就必须选择
。
完美理论
- 给定两个编号都是1到N的树,你需要选
的一个子集,最大化选到的元素权值(可负)的和,同时你选的集合在两棵树上都是连通子图
枚举根,选x必须选x的父亲,最大权闭合子图。
SRM 577 HardBoardPainting
- 一个有障碍的
网格,每次粉刷一横列或者一纵列,不可重复粉刷,求最少的粉刷次数粉刷所有非障碍路。
考虑两个点是横着被刷还是竖着被刷
极小割对应涂色法,极小割对元素有唯一划分,与横边界相连的横涂与纵边界相连的纵涂。
每个格子当成变量,表示横向粉刷这个格子,
表示纵向粉刷,横着相邻的两个格子若在同一个集合就可以一起粉刷获得收益,纵向亦然。最大权闭合图模型。
另一种做法:链接所有相邻的各自,从横向边界到纵向边界做最小割,除以二就是答案
证明:涂色法对应割,一条染色用割掉两端的边表示
极小割对应涂色法,极小割对元素有唯一划分,与横边界相连的横涂与纵边界相连的纵涂。
集合划分模型
- 考虑如下的整数划分
- 即除了每个元素取0,1会有代价的差异之外,若两个变量取值不等则会付出额外的代价,且根据谁选择1代价可变。
- 根据
的取值把元素划分成两个集合,可以容易的建立出最小割模型,采用最大流求解。
- 集合划分模型只处理不同集合的元素对之间的代价,若要相同集合付出代价,需是二分图黑白染色后处理。
SRM 594 Medium FoxAndGo3
- 一个
围棋棋盘,任意两个白子不相等,你要加入若干个黑子并提出白子,最大化空格数目
注意到与白子与相邻的空格最终不可能都为空格,于是连边,接着做最大点独立集,显然是二分图。
最优选择
- 给出一张
个点的无向图,每条边的边权定义为所链接两点点权的异或(异或的性质:每一位独立),有些点权确定,有些没有,请确定所有点的点权,使得边权和最小
-
每一位分开考虑,除固定权值外,此位置不同才付出代价,集合划分模型。
SRM 558 Hard Surrounding Game
- 一个人在一个
的棋盘上面放棋子,在
放棋子有
的代价,一个各自被占领当且仅当其上有棋子或者其所有相邻格子都有棋子,
被占领会获得
的收益,求最大收益(注意要减去代价)
每个格子建立两个点,第一个点表示是否被占领,第二个点表示周围格子是否全部被占领,为避免重复统计收益,还要黑白染色厚在这两个点之间要连边。
离散变量模型
离散变量型网络流一般解决如下问题:
- 每个变量有若干个不同的取值
,并且两个变量之间会对代价产生贡献。
- 一般贡献会和两个变量的差有关。
- 建图方式一般为,对一个点
,拆
个点并连成从
到
的链,割哪一条边就代表取哪个值,贡献用两条链之间的连边表达。
SRM 590 Hard FoxAndCity
- 一张
个点的无向图,边权都为
,你需要添加若干条便,最小化
,
是输入的,
是1号点到i的最短路
比较经典的建模姿势
有边相连意味着
于是可以每个点拆出一排点。
就是离散变量,显然加边不可能让最短路变长,同时原本就有边的两个点最短路差不超过1.
SRM627 Hard LaserTowers
- 你有一个
的矩阵,有些位置有方向固定的激光塔,激光塔能选择这个方向的一个敌人攻击,每个敌人有一个收益,两个激光塔的激光不能相交,求最大收益
对于一个图限制转弯次数(特殊边的经过次数)
有一个通用方法:拆点
每一点拆为横点和竖点
转化为最小割
离散变量为第几个敌人,横向到纵向的割,拆点保证不转多次弯。
BJOI2016 水晶
- 六边形网格中如图分布着能量源,还有
个特定位置的水晶(可在能量源上),你需要炸掉一些水晶石得剩下的水晶不能组成三元环且没有两个水晶分列一个能量源的两侧,最大化剩余水晶的权值和。
考虑每个在能量源的水晶,把无能量源的点黑白染色,则要不炸掉能量源,要不炸掉全黑,要不炸掉全白,离散变量有三个取值,S=val>白=inf>A=1.1val>B=inf>黑=val>T。
最大流&&费用流
技巧主要有:
• 拆点
• 容量限制
• 流量平衡
• 建立超级源汇
• 动态加点
• 线性规划不等式变形(比如差分)
• 线性规划转对偶
• 流量分配
• 匹配与拓展
• 流量平衡
• 欧拉回路
• 带上下界的网络流
• 线性规划与对偶
流量分配
• 一般是把点上的要求变成流量。
• 入流和出流的对接表现方案。
SCOI2012 奇怪的游戏
- 给出一个
的棋盘,每个格子上有一个数,可以给相邻的两个数同时
,相邻指有公公便,求最少多少次操作可以将棋盘上的数变为同一个数,如果不可能输出
.
对原棋盘进行黑白染色。设黑色格点有个,数值和为
;白色格点有
个,数值和为
。设最后所有的数都变成了x,则有:
,即:
。
I. 若,那么就二分答案并检验。
II. 若,那么只需要保证:
1)
2) x >= 棋盘中的最大数;
3) 能通过最大流的检验。
网络建模时,从S点向白色格点建边,流量为x减去格点上的数;从黑色格点向T建边,流量为x减去格点上的数。另外从白色格点向上下左右建边(不超出边界),流量为正无穷。
若求出来的最大流的二倍刚好等于所有格点需要被加上的数的总和,那么此x满足条件,否则不满足条件。
Turning Railways
- 一个
的有障碍棋盘,用回路覆盖所有空白格子,最大化有转弯的格子数目
每个点的理想情况是横着一条边竖着一条边
每个点拆成两个点
横点指向横点,竖点指向竖点
横点竖点之间连一条容量为1,费用为1的双向边
然后跑最小费用最大流
用原答案减去费用流即可
总之:黑白染色,每个点拆两个点分别表示横纵,中间建一条边表示违反代价。
SRM 575 Hard TheTilesDivOne
- 你要在
的有障碍的网格上放尽量多的L型瓷砖(3个非直线连续格子),不能互相覆盖也不能覆盖到障碍,且重心格子必须在黑格子上(黑白染色)
-
(据lzz所说有个出题人特别喜欢47来着)
对剩余白格子再进行红蓝染色,则一个L为红→黑→蓝,最大流模型。
集训队训练D1T2
-
的网格图,里面有一些水管
- 水管可以有很多头(2~4个),其中直线的水管不可以转,别的水管都可以以1的代价旋转90度,可以顺时针或者逆时针转
- 最小化旋转次数使得没有水管头
L型一个行点一个列点
T字给每出边一个不选的损失。
匹配和拓展
- 二分图匹配
- 路径覆盖
- 匹配的存在和唯一性
- 匹配问题的对偶
Codechef SEPT 12 PARADE
-
个点,
条带权单项道路,若干个英雄需要在其中游行,游行可以是路径也可以是贿赂,除了要付出路径的权值外,一个点弱没被任何英雄经过,则要付
的代价,另外如果一个英雄走的是路径,也要付出
的代价送他回家,求最小代价,有
个不同的
路径覆盖→二分图匹配,发现额外代价=C(n-flow)。
K-完备匹配
• 给出一个有
个点的二分图
• 问是否存在个不相交的完备匹配
• 不相交的匹配是指对于同一个节点,每一个匹配中匹配的节点均不相同
•
• Hall定理:若二分图每个点度数均为k则存在k-完备匹配
• 流量分配求k-正则二分图子图
Problem Buyer
- 有
个题目的题库,每个题的难度为
,从中出
个题目,第i题难度需要在
和
之间
- 求最小的
使得对于任意一个
个题目的子集都能凑出一套符合要求的题
很显然k具有二分性质,所以先二分k
霍尔定理,显然是选一个难度区间内的题目最可能不满足,扫描线+线段树维护。
硬币游戏
- 一个
的有障碍的棋盘,两个人轮流移动,不能走重复的位置,不能移动的数,问那些位置是先手必胜的
这个叫做二分图博弈
- 博弈者人数为两人,双方轮流进行决策。
- 博弈状态(对应点)可分为两类(状态空间可分为两个集合),对应二分图两边(X集和Y集)。任意合法的决策(对应边)使状态从一类跳转到另一类。(正是由于这个性质使得问题可以用二分图描述)
- 不可以转移至已访问的状态。(不可重复访问点)
- 无法转移者判负。
如果在最大匹配上就先手必胜
在每个点上面直接BFS/DFS即可,也不会超时
可以做到O(N+M)?没有听懂
PS:搜集到一题BZOJ1443游戏,下次可以做一下
ChessBoard
-
的棋盘上摆了
个车,且他们两两不相互攻击。
- 第i个车必须摆在一个矩形里
- 求哪些车的摆放位置是确定的?
显然匹配,往右保留未匹配边,往左保留匹配边,tarjan缩强连通分量。
BZOJ3118
- 一个无向图,每条边可以花费
的代价权值+1,也可以花费
的代价权值-
1,你需要使得一个指定的树的权值等于最小生成树,问最小花费。
每条非树边对其覆盖的所有树边都有一个不等式。
相当于顶表和,转对偶到匹配。
流量平衡
流量平衡时费用流模型
就是利用每个点流入流量等于流出流量来满足等式,如果流入流量-流出流量=常数,可以通过与源点和汇点连边来实现
混合图的欧拉回路
给一个混合图让你给无向边定向并求出欧拉回路
消负环
- 可以使用流量平衡来消负环
- 首先每个点
拆成
,
两个点
- 对于边
,建立
,再对于每个点,建立
![]()
- 这样做最小费用最大流可以保证每个点的入度等于出度,即若干个环
China-FINAL16 Mr. Panda and TubeMaster
- 在
的网格图里找若干个环,每个点都必须是转角,最大化边权和
最小费用流消负环--->最大费用流消正环
WF2011 Chips Challenge
- 在一个
的网格里面放部件,其中有一些格子已经放置,有一些格子损坏。要求第x行的部件数目等于第x列,同时要求任意行和列的部件数不超过总数的
二维模型+流量平衡限制,枚举每行每列部件数限制即可。
欧拉回路
- 求无向图的欧拉回路
- 可以dfs直接定向(网上有板子可以直接找一下)
混合图欧拉回路
- 给一个混合图你要给无向边定向并求出欧拉回路。
- 先随便定向,建立超级源汇,流量平衡保证出入度平衡。
CF 547D Mike and Fish
- 有一些点
请你对点黑白染色,使得每行每列都满足黑点和白点数目差不超过1
考虑行列建点,每个点变成边。
如果是欧拉图,那么每个点的入边=出边,考虑每一个行点,把入边都染成黑色,出边都染成白色那么就一样多了。
但是有可能一开始不是个欧拉图(有点的度数为奇数),我们可以对度数为奇数的点两两配对(一定有偶数个),然后就一定是个欧拉图了。跑无向图输出欧拉回路即可。
CF 429E Point and Segments
- 有一些区间
请你对这些区间黑白染色,使得每个点覆盖它的区间中黑白颜色数目之差不超过1
lzz貌似建议去做IOI的题目(逃
每个区间可以看成从l到r+1的一条边,一端++一端--,方向对应加减。
欧拉回路?差不超过1怎么处理。
相邻的奇数点加边匹配。
UNR #3 D2A. 转圈
- 给一个平面上的无向图,请你走一个欧拉回路,最小化总共转过的角度?
引出一条射线,逆时针传过权值-1,顺时针传过权值1,最大费用流。
给边初始定向然后通过流量分配来解决,定向保证没有负权边。
带上下界的网络流
- 建立超级源超级汇,由下界计算出每个点冗余/亏损多少流量,用和超级
源汇连边实现。- 用新图的流量平衡保证原图流量平衡,注意要在原图上建立
到
的边。
UNR #2 D2B. 奇怪的线段树
- 给一根任意分治(输入给定)的线段树,一个区间有唯一的拆分方法,一个节点会染黑它拆分出来的节点。
- 现在你需要使用最少的区间把指定的节点染黑
一个区间拆出来的一定是若干个连续右孩子+若干个连续左孩子
把树建成DAG然后是指定覆盖,用下界最小流做。
区间选择
- 给出
个区间(值域
),选择第
个区间会得到收益
- 数轴上每个点最多只能被k 个区间覆盖
- 要求选出一些区间,使得收益最大
从左向右连一条容量k 的链,区间从左端点到右端点连边。
NEERC 16 Delight for a Cat
- 一只猫有
天,第
天选择吃饭可以获得
,选择睡觉可以获得
,连续k天至少睡觉
天,至少睡觉
天,最大化收益
不妨假设全部睡觉,从到
连边容量为
,若走这条边表示今天改为吃饭。总流量上限为
表示最多吃饭的天数,从
到
连边容量为
表示之前k 天至少选择
天吃饭否则达不到最大流量,最小费用最大流建模。
NOI2008 志愿者招募
这题被lzz咕掉了