网络流/二分图相关笔记(应用篇)
command_block · · 算法·理论
请配合 : 网络流/二分图相关笔记(干货篇) 食用,否则可能无法理解某些内容。
1.网络最大流题目泛做
可能会用
最大流建模
把流当成移动,路径,选择等等之类。
-
P2472 [SCOI2007]蜥蜴
题意 : 一个矩阵中有若干个石柱,每个石柱都有自己的耐久度。
现在有一些蜥蜴站在部分石柱上,蜥蜴可以跳到欧几里得距离不超过
d 的地方。蜥蜴每次起跳,脚下的石柱都会失去一点耐久,耐久为
0 则石柱损毁,不能落脚。问最多能有多少条蜥蜴能够跳出边界。
把蜥蜴的移动当成流,耐久当成容量。
每个石柱需要限流,拆成出入点,之间连上限制。
蜥蜴一开始待在入点。从原点向有蜥蜴的入点连边,容量为
根据跳跃条件,从出点向其他石柱的入点连边,容量为
能跳出边界的地方,出点向汇点相连,容量为
评测记录
- P2766 最长不下降子序列问题
先用朴素DP
求出
然后查看
每个位置拆点限制流量为
然后将
评测记录(久远)
- P2754 [CTSC1999]家园 / 星际转移问题
发现在时间不同时,能走的转移是不同的,考虑按照时间分层。
如果在对应时间有一辆飞船从
可以证明,若有解,每经过
我们可以枚举时间,每次新增一层然后增广,如果超过
评测记录
- P3163 [CQOI2014]危桥
首先,往返可以看做走双倍次数。
我们按照桥的容量建边,然后分别限制两个源汇的流量,这些都是经典操作。
现在跑最大流,出现了两个问题:
-
①可能有些流从
a_1 出发却到达了b_2 ,或者从b_1 出发到达了a_2 。 -
②我们只能限制有向边的流量,可能某些危桥从两个方向都经过
2 次,共4 次。
难以通过精妙的建模规避掉这些问题。奇妙的是,直接将
-
①先在
a_1,b_1\rightarrow a_2,b_2 跑一次最大流,可能得到如下情况。(注意是无向图,流可以双向流动)\begin{cases}a_1\leftrightarrow a_2=a_n-x &b_1\leftrightarrow b_2=b_n-x\\a_1\leftrightarrow b_2=x &b_1\leftrightarrow a_2=x\end{cases} 交换
b_1,b_2 后,再跑一次,可能得到如下情况。\begin{cases}a_1\leftrightarrow a_2=a_n-y &b_2\leftrightarrow b_1=b_n-y\\a_1\leftrightarrow b_1=y &b_2\leftrightarrow a_2=y\end{cases} 不妨设
x\leq y ,能够发现,如果让a_1\xleftrightarrow{x} b_2\xleftrightarrow{y} a_2\quad b_1\xleftrightarrow{x} a_2\xleftrightarrow{y} b_2 如此衔接,就能构造出符合题意的方案。若两次最大流任意一次不满,则肯定无解,这是充要条件。
-
②容易发现,同一个源流出的流量不可能从两个方向同时经过一座桥。
危桥从两个方向都被经过,只有可能是
a_1\rightarrow a_2,\ b_1\rightarrow b_2 的两种流都经过。那么交换
b_1,b_2 后,一种流被反向了,现在是同向,则会一并受到限制。
评测记录
- P5029 T'ill It's Over
容易发现,每节蜈蚣的最优决策都是相同的,我们直接把
对于每种光明程度,分别建立一个点,源点连
能够发现,所有的操作都是从一个区间连向另外一个区间,使用一上一下两颗线段树加虚点优化建边即可。
点数是 Dinic
求最大流就已经足够快了。
评测记录
匹配问题
这类问题把源当做物品,把汇当做盒子,流的意义是匹配(决策)。
- P3386 【模板】二分图匹配
二分图的定义见第二节。
我们把左部点设为源,右部点设为汇。每个点只能连一次,所以源汇的容量都是
把多个点变成源并限制流量 : 从大源给每个小源分别连一条钦定流量的边。
连边可以变成左部点到右部点的一条有向边。
容易理解这些流和匹配是等价的。
有一个结论是Dinik
跑经典二分图匹配的复杂度是
评测记录
- P2055 [ZJOI2009]假期的宿舍
把在学校的人匹配到床上,如果最大匹配
具体方法:建立二分图,左边是人,右边是床,每个人向能用的床连边。
评测记录(久远)
-
P2763 试题库问题
题意 : 你有
m 个干员,每种干员会做的工作已知。一个干员不能同时做两份工。
右侧带容量的二分图匹配。评测记录(久远)
- P3254 圆桌问题
能发现等价于两侧都带容量的二分图匹配。评测记录(久远)
- P4251 [SCOI2015]小凸玩矩阵
考虑二分答案
现在的问题是能否找出
这可以看做一个二分图匹配问题,行和列分别为左右部点,若某行某列能放置则连边,这样就能满足“一行只对应一列”的条件了。
评测记录
- P2402 奶牛隐藏
先跑Folyd
。然后二分时间
我们要把牛分到牛棚里面去,直接二分图匹配即可。
评测记录(久远)
- CF852D Exploration plan
仍然考虑二分时间,判定条件变成了最大匹配
- CF546E Soldier and Traveling
每个点上的士兵只能留在自己,或者向相邻的点移动。考虑拆成出入点变为二分图。
从源点连向入点,容量为初始时的人数。从出点连向汇,容量为结束是的人数。
然后对于每条边,从对应入点连向对应出点,边权为
求最大流。如果初始和结束的总人数不同,或者不满流,则为无解。否则查看反向边的流量输出构造。
评测记录
- CF628F Bear and Fair Set
差分一下能够发现,这些限制本质上是把
对于每一段,限制总流量为数的个数。我们分别计算模
如果最大流是
评测记录
- P3425 [POI2005]KOS-Dicing
考虑二分或者枚举,问题转化成判定所有人都赢不超过
给每场比赛新建一个点,从源连一条边,限制流量为
每个人连向汇点,流量限制为
构造方案可以查看比赛的流给了哪一方。
评测记录
-
P1231 教辅的组成
题意 : 这是一个三分图。第一层和第二层之间有若干对应关系,第一层和第三层之间也有若干对应关系。同层之间无关系。
如果找出三元组
(x,y,z) 使得其分别属于一二三层,而且x 与y,z 都有对应关系,则称为好的。如果每个点只能用一次,求最多能组成的好的三元组的个数。
初看起来像三分图匹配,但是由于二三层之间无关系,还是能够网络流解决。
把第二层连汇,第三层连源,权值为
容易发现一条流就对应一个好的三元组。
评测记录(久远)
- P2825 [HEOI2016/TJOI2016]游戏
先考虑没有硬石头的情况。相当于不能在同一行或同一列放置两个炸弹。
类似P4251
,可以看做一个二分图匹配问题。
若考虑硬石头,可以视作把完整的行/列分成了若干互不影响的段,我们按段的编号建立二分图即可。
评测记录
- P6517 [CEOI2010 day1] alliances
这是个方格图,先黑白染色变成二分图。若没有人类不杠的限制,直接跑二分图多重匹配即可。
能够发现,若不杠又需要两个邻居,一定是一横一竖。我们只需要把人类拆成两个点,一个接一个横,另一个接一个竖即可。
查看匹配情况输出方案。 评测记录
- P3153 [CQOI2009]跳舞
先考虑
建立二分图,左侧是男生,流量为
然后跑匹配,如果满流说明答案可以达到
接下来考虑
男生拆为三个点 :
连接
连接
对于女生建图方法类似。
然后在
评测记录
- P3324 [SDOI2015]星际战争
时间这种自带
二分之后,每个激光武器就相当于针对每个机器人拥有了一定量的“输出值”可以随意分配。
具体地说,每个激光武器的初始容量为
如果最大流满流则说明可以在 long long
。
评测记录
- P5038 [SCOI2012]奇怪的游戏
这是个方格图,首先考虑黑黑白染色。每次我们只能对一个黑色的格子和一个白色的格子同时
设白色的位置有
那么需要的操作次数是
听过简单的变形得到
若
若
满足单调性,可以二分,现在我们的任务就是判断某个
我们可以计算出每个点需要加多少次,不难发现两个位置都加一的规则就是二分图带容量匹配。
评测记录(久远)
- P2570 [ZJOI2010]贪吃的老鼠
神仙题.jpg
同样先乘以
这样我们就得到
我们按照时间段分层,每层中老鼠能够吃的奶酪就是确定的,每只老鼠能够吃多少奶酪也是确定的。
然而现在还有吃奶酪一对一的要求,这里的流量参差不齐,无法像经典二分图匹配那样自然做到一对一。
设某块奶酪在某一段时间 ( 设长度为
注意到时间区间不交就等价于要求
这是对所有老鼠共同的限制,如果让每只老鼠分别占用一个点,就不好控制。
先列个式子,这一段内被吃掉的总体积为:
(不妨按照
可以看出,第
注意到
通过旧意义下的方案,直接根据那个和式就能得到新意义下的方案。
根据一组新意义下的方案,我们能差分得到
直接求最大流即可。评测记录
- P5786 [CQOI2008]传感器网络
考虑把每个点匹配给自己的父亲,建立二分图,左侧为出点,右侧为入点。
考虑二分/枚举,接下来就需要判断负载级别为
每个点只能有一个父亲,于是限制左侧容量一律为
注意,控制中心的流量不受限制。如果满流则有解。
接下来考虑字典序,不难想到逐位贪心。先钦定若干匹配,然后在剩下的图中跑匹配,看看是否满流。
逐位枚举,需要
[评测记录] ()
- P4382 [八省联考2018]劈配
我们考虑将选手匹配向导师。
同阶志愿对于某个选手是没有区别的,所以可能存在后面的选手让前面的选手反悔的情况。
对于每个选手,逐次检查每阶志愿中是否有可能空位,若有,则连向该阶志愿的所有导师并增广。这会留下反向边,自然处理了反悔操作。
现在问题在于如何判断某个导师是否可能有空位。等价于问某个导师的点到汇点是否有增广路,从汇点反向搜索即可(注意,图上有环,不能瞎搜)。
这样需要 BFS
,复杂度上界是
接下来是第二问,不难发现某个前缀所造成的导师“填满”状态是固定的。
二分一下新的排名,然后查看是否能满足要求即可。这部分复杂度是
评测记录
- CF793G Oleg and chess
这是一个经典的车放置问题,可以二分图匹配解决,但是连
考虑优化建边,不难想到主席树+扫描线,这样点数和边数都是
另一种更加牛逼的做法是 : 利用题目中黑矩形不交的性质,从每个矩形的上下边界向外延伸(遇到障碍就停止),能够将整个图的空位剖分成
_______________________
###________________
###___________##
### #### ##
____###_____####__##___
____________####_______
空矩形只有
对于每个空矩形,相当于从左部点的一个区间连向右部点的一个区间,我们分别维护两颗线段树即可。
这样边数还是
至于这些矩阵怎么划分,反正
- CF212A Privatization
神仙题,找不到题解,看wxh
神的代码学了一下 /kel。看不懂结论,咕咕。
https://codeforces.com/contest/212/submission/34274620
棋盘染色
对于一个棋盘,像国际象棋那样染成黑白两色,容易发现这是个二分图。
由于这类题实在太多,这个套路又比较简单,就不单独归类了。
最小割建模
-
P2774 方格取数问题
题意 : 给出一个带权值棋盘,相邻的两个东西不能选,问能选的最大总和。
把网格像国际象棋那样染成黑白两色,容易发现这是个二分图。
这里“不能选”的限制有点类似割,我们考虑最小割。即割的尽量少,保留的尽量多。
相邻的不能选,相当于割断二分图。
我们把中间边设为INF
,这样不会被割掉。
然后源汇均按权值连边即可。
评测记录(久远)
- P5039 [SHOI2010]最小生成树
根据 Kruskal
,其他边
考虑 Kruskal
的排序建立过程,把小于
使得某条边
评测记录
- P5934 [清华集训2012]最小生成树
和上一题类似,甚至不需要推结论。
对于最小生成树,取出权值小于关建边的边跑一次最小割。
对于最大生成树,取出权值大于关建边的边跑一次最小割。
评测记录
- P2598 [ZJOI2009]狼和羊的故事
建篱笆就是最小割,源连狼,羊连汇,容量为
评测记录(久远)
- P6094 [JSOI2015]圈地
可以让源连南南的房子,强强的房子连汇,容量均为价钱。
每个格子向四连通的方向连对应墙代价的边。
能够发现,一个割就对应着一种合法的方案。(割了房子就代表不卖,割了墙就代表造墙)
将所有可能的收益求和,减去最小割即为答案。 评测记录
- P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查
注意到意见只能有两种,我们可以以
朋友之间连一条双向边,权为
对于持有
求出最小割即为答案。评测记录(久远)
-
P3227 [HNOI2013]切糕
鉴于题目很不好懂,特别解释一下题意 :
有一个
P\times Q\times R 的蛋糕,每个点有一个不和谐值v[x][y][z] 。目标是将这个蛋糕切成上下两块。
对于每一竖轴,以
(x,y) 表示。需要在每个竖轴中选择一个断点,设(x,y) 的断点z 坐标为f(x,y) 。那么,对于四相邻的竖轴,其
f 值的差不能超过常数D 。目标是使得
\sum\limits_{x,y}v[x][y][f(x,y)] 最小。
我们把蛋糕下表面的点连上源,上表面的点连上汇,这就是一个最小割问题。
如何控制
我们可以从某个
这样,如果两个相邻轴的
若两个相邻轴的
按照上述方法建图后求最小割即可。 评测记录
- P6054 [RC-02] 开门大吉
不难发现一套题可以整体处理,首先计算出第
接下来就是一个分配问题,但是还有若干 “第
不难发现和上一题十分相似,我们可以想办法让差超过
点
接着,对于一个限制
若
能够发现,若最终割掉的两个位置是
求最小割即可。流量过大则表明无解,注意适时break;
评测记录
- P5458 [BJOI2016]水晶
这是一张密铺图,虽然不能像方格图那样染成两色,但是能按照
观察发现,共振总是恰好包含三种颜色的水晶各一个。要用最小的代价“割断”共振。
可以看做一个三层图,有若干个限制,每个分别选取每一层的一个点组成三元组
一般的情况不太可做,随手建了个模得了
观察限制的特殊性,发现能量源的地位十分特殊。
将两种共振综合考虑并讨论,能发现等价的约束 : 某个能量源若存在,其周围最多只能有一种颜色的点。
不妨称能量源为红色,另两种为黑白。则从源连向黑点,从白点连向汇,容量为点权。
接下来,对于一个红点,拆成出入点,中间连边,容量为点权。对于相邻的黑点,连边到入点,对于相邻的白点,从出点连向它们,边权均为
不难发现,该图的割的条件和转化后的约束等价。
接下来就是最小割了。一些细节 :
- 点的位置可以用
(x-z,y-z) 更好地描述,然后用std::map
检索。 - 由于
10\% 的存在,需要把容量整体乘以10 变为整数。
评测记录
- P3756 [CQOI2017]老C的方块
仍然是一道奇怪的题目。
发现四种形状都恰好包含一条蓝色竖线和四个格子,那么不妨把方格图染成四色,使得每个形状恰好含有四种颜色各一个。
经过一阵手玩之后,染成了这样:
有了上一题的教训,我们不拆分,综合考虑这些限制,发现等价于要求下列子图中,四种颜色不能同时存在。
那么我们按照右侧的方法建边,就能限制至少割掉一种颜色。
接下来就是大量染色和连边的细节,就不赘述了。
最后求最小割,由于图近似二分图,
- P1791 [国家集训队]人员雇佣
若一个人在
先不考虑竞争。从源点给每个人连边
考虑
接着考虑竞争,这会令
接着就是求总收益减去最小割( 需要long long
),由于边非常多,可能需要卡常。 评测记录
-
P1361 小M的作物
题意 : 把若干个物品分配到
A,B 两个盒子里面。每个物品分到不同的盒子有不同的收益。同时,钦定若干个物品集合一并丢到某个盒子里面的额外收益。
用最大流的思路并不容易建模。注意到这里只有两个盒子,选某个盒子可以看做割另一个盒子。
首先建立一个不考虑集合的图。可以把每个点串联
不难想到
现在考虑集合,对于某个集合,如果其中某个点的
我们可以考虑把集合
这样,我们对每个集合建立
然后连边到对应的物品上,边权为INF
防止被割。
如果要割掉任意一个物品边,都必须要割掉所对应的所有集合边,否则白割。
整张图是对称的,对
由于图很稠密,写vector
会快一点(2
倍速左右)
评测记录
- P4313 文理分科
棋盘和四连通是吓唬人的,根本不需要黑白染色,其实就是 P1361
。评测记录
- P1646 [国家集训队]happiness
棋盘和四连通又是吓唬人的,其实就是 P1361
。评测记录
- CF311E Biologist
其实就是 P1361
,只不过多了个倒贴钱。评测记录
- P1935 [国家集训队]圈地计划
这是个四连通网格图,先黑白染色变成二分图。
不相同才有奖很不爽,直接交换右部点的
然后就是P1646
了。评测记录
- P3308 [SDOI2014]LIS
模仿P2766
,首先还是DP
求出LIS
。
画出最优转移的DAG
,我们的目标就是把这个DAG
割了。
每个位置拆点,点权为
考虑构造一组字典序最小的最小割,一个简单的想法是逐位贪心,但是(就算使用二分)仍然需要求
回忆上文“最小割的必须边和可行边”。
我们可以先安排一个
一种暴力的想法是,删掉这条边,重新跑一次最大流。这需要
我们考虑在原网络信息的基础上进行调整。
接下来引入一种重要的操作 : 退流。
观察删去某条边
考虑调整,不难发现从
这样仍然需要
能够发现退流往往只会涉及部分网络,最好使用不完全BFS
优化。
前面提到,可以缩SCC
求可行边,但是这题的图在不断变化,只好直接暴力搜索,查看是否有增广路。
搜索的复杂度上界是
评测记录
- CF724E Goods transportation
首先有一个显然的最大流解法 :
然而数据范围很大,就算使用区间数据结构优化建边也过不去。
注意到图很特殊,我们考虑使用DP
求解最小割,就能得到最大流。
设
-
若在
S 集中,则需要割断与T 集之间的边,以及本身到T 的边。 -
若在
T 集中,则只需要隔断与S 集之间的边。
转移方程 :
最后
暴力求解(需要滚动数组),复杂度为
设最终方案为集合
不妨令初始状态为所有点都在
若将
要割的边数
若都是
现在已经有
不难发现,关于
我们把
加入的过程中,每种状态都是一个合法的割。
考虑如何让这个过程中产生的割代价“最低点”最小,显然应该先加入权值尽量小的点。
按照权值排序贪心即可,复杂度
最大闭合子图建模
-
P3410 拍照
题意 : 有
n 个元素,要求选择若干个组成集合S ,选择每个元素都有代价。给出若干个悬赏
T ,如果T\subseteq S 则获得该悬赏的奖励,问最大净收益。
经典问题。元素必须集齐可以转化成闭合子图条件。
每个悬赏点权为奖励,出边连向所需的所有元素。这样,由于图闭合,想获得奖励,所有这些元素都必选。
元素的点权为(负)自己的代价。跑最大闭合子图模板即可。
评测记录
希望构造方案请见 P2762 太空飞行计划问题
-
P2805 [NOI2009]植物大战僵尸
发现不会做这道题是写作本文的动力之一。
题意 : 一个网格图上,有若干个法阵,每个都有其防御位置集合。
我们可以从地图右侧发射光球,向左飞行。如果光球途径某个(未摧毁)法阵的防御范围,则会被吸收而不能起到攻击作用。
对于一个法阵,如果其能源参数为负数,则表示摧毁这个法阵需要付出能源,否则表示能收益能源。
问在这次攻击行动中,能获得多少能源的净收益?
而要想摧毁一个法阵,必须要把防御它的其他法阵都干掉,则对应“出边必选”的闭合条件。
由于光球只能向左飞行,摧毁一个法阵需要摧毁之前的所有法阵,可以认为每个法阵会保护身后的一个。
我们将每个法阵向防御它的所有法阵连边,然后求最大闭合子图即可。
问题在于可能有一些法阵互相保护,这些法阵就相当于无敌了(和经典的最大权闭合子图不同),被它们保护的其他法阵也无敌了。
可以在反图上拓扑排序取出没有无敌效果的点。
评测记录
- AT3672 [ARC085C] MUL
能够发现, 若打碎第 DAG
,排个序看看就得到了)
然后我们可以从
注意需要开long long
。 评测记录
- P4174 [NOI2006]最大获利
某个用户能贡献当且仅当其使用的两个基站都建造,最大闭合子图模板题。评测记录
- CF1082G Petya and Graph
选某条边一定要选两个端点,变成 P4174
。评测记录
- P3973 [TJOI2015]线性代数
首先把式子化一化 : (不熟悉线性代数是不是就跪了啊……)
能够发现,如果选择
搞了半天原来还是同一个题,直接最大闭合子图带……走? 点似乎有
考虑到该类问题的特殊性(
若
对于一组
-
x,y∈S$ 损失 : $C[x]+C[y] -
x\in S,y\in T$ 损失 : $B[x][y]+B[y][x]+C[y] -
x\in T,y\in S$ 损失 : $B[x][y]+B[y][x]+C[y] -
x,y\in T$ 损失 : $B[x][x]+B[y][y]+B[x][y]+B[y][x]
在最小割中,如果想要仅用
考虑每种情况中割掉的边以及对应的损失,能得到方程组:
解这个方程组,发现没有产生矛盾。解得:
上面是两个点的情况,现在考虑多个点的情况。
为了避免小数,把流量扩大一倍,求最小割即可。
评测记录
前面的几个题也都可以如此减少点数到
- P3749 [六省联考2017]寿司餐厅
首先能够发现,由于可以取多次,每次只取一个区间的限制可以忽略。
观察代价计算方式,每种代号的寿司,只要吃任意一种,都会带来
而观察
注意到
( 分别向每个寿司连边不仅效率低下,由于
然后,对于代表单种寿司的
求最大权闭合子图即可。评测记录
- P3872 [TJOI2010]电影迷
一种扩展的最大闭合子图。原先是要求一定闭合,现在可以花费某种代价删去一条有向边的约束。
仍然考虑类似的建图,正权点连源,负权点连汇,有向边的边权不再是
答案仍然是正点权和减去最小割。评测记录
- P4177 [CEOI2008]order
若不存在租用,完成一项工作必须购买对应的所有机器,这就是个经典的最大闭合子图问题。
接着考虑租用,可以类似上一题,将租用视作花费一定代价忽略某条边的闭合限制。
即 : 从每个工作向对应的机器连边,边权为租用费用。然后求解扩展最大闭合子图。
评测记录
- CF103E Buying Sets
容易发现,题目中给出的特殊性质就是
所以我们建立二分图,左侧是集合,右侧是元素,集合向其中的元素连边,一定有完美匹配。
任取一种完美匹配,不妨设集合
我们取
若子集等于并集,这就是一个合法解,若并集更大则不合法。考虑如何限制,不难想到利用闭合子图。
让集合向着所包含的元素连边(强制选并集),元素沿着完美匹配向着集合连边,求最小权闭合子图即可。
评测记录
- P5295 [北京省选集训2019]图的难题 & B. 【UR #11】元旦老人与丛林
首先可以手玩一下,能够发现一个图合法的必要条件 :
这是比较显然的,
接着,我们猜想 : 若每个子图都满足
证明比较神仙,看这里 : http://jiry-2.blog.uoj.ac/blog/1115
考虑给边赋权 CF1082G
,得到权最大的子图。
若这个权大于
但是注意道我们总是可以选择空集,所以总是得不到负数的结果。也就是说我们真正想求的是“最大权非空闭合子图”。
可以采用比较暴力的办法,直接枚举必选那个点(容易发现只需要枚举“点”),然后给剩余的部分跑一遍完整的最大权闭合子图。
由于这是二分图,复杂度是
每次都重新跑十分浪费,注意到删除一个点只是相当于删掉了右部点到汇的一条容量为
我们一开始做一个二分图匹配,每次直接把被删除边的流量退掉即可。
由于流量很少,复杂度是有理有据的
DAG(偏序集)建模
- P2172 [国家集训队]部落战争
观察到只能向下移动,这是个 DAG
,然后求解(点不相交)的最小路径覆盖即可。
评测记录
- P5769 [JSOI2016]飞机调度
发现按时间分层点数太多无法承受,注意到任务数量较少,而且都以绝对时间标定,不妨将任务看成状态。
先使用 Folyd
(注意维修时间)求出两两最短路,然后将每个任务连向完成后(注意必须直飞)还来得及接的其余任务。
按起飞时间排序,我们能发现这是个DAG
,跑最小路径覆盖即可。
评测记录
- P4589 [TJOI2018]智力竞赛
考虑二分,每次判定能否答完价值低于
问题转化成 : 给出一个DAG
,使用允许相交的
搞个传递闭包就转化成可相交链覆盖了。
由于点数较少,也可以直接枚举并加边。评测记录
- CF590E Birthday
首先能够发现,包含关系是一个偏序集。
建立AC
自动机,众所周知,fail
树中,祖先是儿子的子串。
暴力跳fail
连边复杂度是dfs
遍历fail
树会爆栈)
一个比较好的方法是,每个点向最近的一个祖先连边,然后传递闭包。
然后就变成了最长反链问题,复杂度为
二分图建模
比较平凡的二分图匹配除外。
- P3355 骑士共存问题
能够发现影响是二分图。(国际象棋中,骑士走一步,落脚点和起点的颜色一定不同)
然后求解二分图最大独立集。
评测记录
- P3033 [USACO11NOV]Cow Steeplechase G
容易发现横线段互不相交,竖线段互不相交,这是个二分图。
选出互不相交的尽量多的线段,等价于二分图最大独立集。
评测记录
- P2423 [HEOI2012]朋友圈
题意就是让我们求解朋友关系的最大团。在一般图中,这是个NP
问题,我们需要利用本题中图的特殊性质。
观察
观察
出题人比较憨逼,给这么大的数据范围,然而造得很水,我们可以随手加几个剪枝用Dinic
跑过去……
评测记录
- CF976F Minimal k-covering
发现没见过类似的模型,直接做比较困难。
不妨对答案方案取补,限制就变成了 : 每个点最多被连接
我们求出(带容量的)最大匹配,然后取补就能得到最小的
对每个
评测记录
- CF1198E Rectangle Painting 2
注意到代价是
现在问题就是,对于每个黑点,要么所在的行被涂黑,要么所在的列被涂黑。
这能够转化成二分图最大点覆盖问题 : 行在左边,列在右边,黑点是中间的边。
但是正方形网格非常大,黑色矩形却很少。
考虑暴力离散化得到
评测记录
- CF786E ALT
将居民和守卫看做二分图,居民对守卫的要求看做边。不难发现这个二分图的最小点覆盖就是答案。
显然
构造方案需要按照割集查看,不能直接利用二分图的性质了。
评测记录
- P4055 [JSOI2009]游戏
这是个方格图,首先黑白染色变成二分图。
现在就把问题抽象成了一个二分图博弈 : 可以自行选取起点,通过二分图上的边移动,并将该边删去,不能移动者负。
先求出一个最大匹配,假设先手选在某个非匹配点开始。
那么,若没有出边,则后手负。若有出边,则后手必定来到匹配点,否则可以增广。
接着,先手可以走匹配边,这样又变成了后手到达非匹配点的局面。
若有出边则后手必定来到匹配点,否则产生交错路,可以增广。
先手总是可以走匹配边,后手必败。
而最大匹配可能有多种,某个点只需要在其中任意一种不是匹配点,先手都有必胜策略。
接着说明其他的点都是先手必败。这些点必然总是匹配点,那么后手操作一次之后就总是变成先手到达非匹配点的局面,先手必败。
所以我们求出所有可能的非匹配点,即为答案。
大多数人都是用的匈牙利,所以判断非匹配点在二分图上dfs
一下偶路径就好了。
网络流也不是不能做,枚举每条满流边,把流量退掉,查看是否存在新的增广路。这可以搜索出
总复杂度就是
Hall定理
- P3488 [POI2009]LYZ-Ice Skates
可以二分图匹配做,但是数据范围太大,观察到只需要判定是否有完美匹配,考虑Hall定理。
每次操作会增加
能够发现 : 左侧选择连续型号的人,能够使得连向右侧的点集尽量小。
也就是说,我们要求左侧对于任意的
令左侧的每个点点权减去
线段树维护最大子段和查看是否
评测记录
- CF981F Round Marriage
考虑二分,然后转化成了判定二分图是否有完美匹配。
先拆环为链,距离不超过环长的一半,这是合法的。
和上一题中类似,选择连续的 boy
,能够使得连向 girl
的点集尽量小。
设 boy
最靠左能匹配到的 girl
编号,
对区间
前缀
[评测记录] ()
- #6062. 「2017 山东一轮集训 Day2」Pair
对于
将
类似地,选择
对两个序列前缀的限制可以等价为 :
先离散化,每个
事先将
评测记录
- CF1009G Allowed Letters
可以按照字典序贪心,但是可能导致后面没东西填,产生后效性。
填写每一位之前,可以先判断一下后面的位能否形成完美匹配,如果能才填写。
具体的讲,每个字母按照数量限制流量,右边连向每个位置,跑二分图带容量匹配看看是否满流即可。
但是这会需要
又能发现字符串上的一个位置最多只有
观察填写一个位置可能造成的影响 : 一个右侧点和一个左侧点容量一并减少
那么,可以每次填写后
暴力维护一下子集求和就可以
评测记录
-
AT2645 [ARC076D] Exhausted?
[??记录]AT2645 [ARC076D] Exhausted?
-
CFgym102268D Dates
暂咕。
最小割树
- P3329 [ZJOI2011]最小割
建立最小割树,枚举源点暴力 dfs
求每两个点之间的最小割即可。评测记录
- UVA11594 All Pairs Maximum Flow
做法同上,注意行末不能有空格。评测记录
- P4123 [CQOI2016]不同的最小割
把最小割树的边权丢进 std::set
然后输出 size()
即可。评测记录
- P3729 曼哈顿计划EX
安全系数其实就是最小割。一个点集的最小割等于其中任意两点的最小割的
建立最小割树,问题变为 : 选择一个点集,在满足权值和
这可以把最小割树中的边按权值从大到小依次加入,使用并查集维护最大的联通块权值和。离线从小到大回答询问。
评测记录
- CF343E Pumping Stations
建立最小割树,相当于在树上按一个排列移动,求路径
考虑限制最紧的一条边 : 权值最小的那条边。
我们要尽量少地经过这条边,至少经过一次,也容易构造出这个下界。
然后,我们这条边删去,得到两颗子树,变为子问题。
合并时将两棵子树的排列直接接在一起即可,接口上恰好经过一次权值最小的边。
这部分复杂度
2.费用流题目泛做
可能会用
类最短(长)路问题
- P2153 [SDOI2009]晨跑
注意到点不相交的限制,拆点并限制流量为
评测记录(久远)
- P2045 方格取数加强版
没有点不相交的限制,但是每个点只能贡献一次。
把每个点拆成出入点,之间有两条边,一条只能走一次,但是能贡献费用,另一条可以走无穷多次,但是费用为
原图的边不限流量,无费用。
然后跑最大费用最大流即可。(增广路较长,费用范围大,图稀疏,不使用zkw
的一例)
评测记录(久远)
- P4013 数字梯形问题
拆点,之间的边费用为点权。
-
限制① : 点限制流量为
1 ,边限制流量为1 -
限制② : 点不限流量,边限制流量为
1 -
限制③ : 点和边均不限制流量。
评测记录
- P3356 火星探险问题
我们将每个位置拆成出入点,先连上INF
边,若有石块,额外连一条容量费用均为
容易发现这是个DAG
,原图的边不限流量。求最大费用最大流即可。
主要难点在于输出方案,通过比对原图和残量网络能够得到每条边被多少辆车子经过。
评测记录
- P4012 深海机器人问题
和上一题差不多,只不过贡献在边上,而且变成了多源多汇。(甚至不需要输出方案)
评测记录
- CF818G Four Melodies
我们考虑让一个流代表一个子序列,那么流只能从左往右,这是个DAG
。
要长度总和尽量大且不交,非常套路地把每个位置拆点,限制容量为
直接按照题目中给出的限制向后连边,可能会产生
能够发现,对于模
对于
求最大费用最大流即可。评测记录
- UVA1486 Transportation
考虑差分建边,也就是给每条边的每单位流量单独建边,容量为
第
这样,如果流了代表流量
由于平方的凸性,最小费用流一定会先走代表流量低的边,这就保证了合法性。
由于容量很小,直接建就好了。接着就是最小费用最大流的模板了。
评测记录
- CF1187G Gang Up
来了个真正的按时间分层费用流。考虑一条链的最差情况,容易证明时间消耗最多
原图的边有平方代价,可以差分一下变成多条边(都是套路)。直接建立所有的边,边数会达到
由于选择边的单调性可以动态建图(类似P2050
),边数可降为
连
这样,一个点完整地从
需要求解最小交换次数,可以给每条边附加
还有个问题,如果某个点原来有黑棋,后来没有,或者原来没有后来有,必然产生一次“只入”或“只出”。
如果
然后源点向原来的黑棋
各个位置之间按八联通规则连边,跑最小费用最大流即可。
评测记录
- P4452 [国家集训队]航班安排
观察数据性质,已经给出了满足三角不等式的费用和时间矩阵,也就是说我们直飞一定是最优的。
容易想到根据时间分层,但是点数太多效率低下。
观察到请求数量不多,且都由绝对时间限制,这就说明两个请求之间的关系是确定的。
我们给每个请求建立一个点,容量为
然后查看所有其他请求是否来得及接,如果来得及,连边费用为
注意也要与基地连边。
求最大费用最大流即可。评测记录
费用匹配
- P4014 分配问题
这是个经典的带权二分图匹配问题,在中间的匹配边上加上费用,最大费用最大流即可。
由于图较为稠密,且增广路一般较短,建议试试zkw
费用流。
评测记录
- P3967 [TJOI2014]匹配
多了一问 : 二分图带权匹配的必须边。
懒得分析,由于数据范围小,可以搞一些比较暴力的解法。
直接暴力枚举所有目前在匹配中的边,删去查看带权匹配是否减小。这样需要
原来还搞了个
- P4015 运输问题
加入了流量,带权多重二分图匹配。 评测记录
- P3705 [SDOI2017]新生舞会
先搞个01
分数规划,将边的权值置为
然后就是带权二分图匹配,跑(实数)最大费用最大流即可。
如果觉得太慢可以转成整数费用流,学习zkw
,或者学习更加有理有据的带权匹配算法。
评测记录(EK)
- P4134 [BJOI2012]连连看
能够发现就是个带权匹配,没听说过2012年引入了一般图带权匹配,先有理有据地猜测这是个二分图。
建立出
然后跑个二分图带权匹配就是了,注意到
评测记录
- P2488 [SDOI2011]工作安排
仍然是二分图带权带容量匹配,只不过费用是分段函数。
观察数据限制发现,这个分段函数是凸的,那么直接给每一段建立一条边,一定会先走前面的边,就已经符合题意了。
求最小费用最大流即可,注意答案存储需要开long long
。 评测记录
- UVA11613 Acme Corporation
如果没有保质期限制,非常简单。
对每一天建点,连源,容量为生产力,费用为(负的)成本; 连汇,容量为最大售出量,费用为单价。
每天连向下一天,费用为
但是本题有保质期限制,所以第
数据范围较小,可以直接转为费用匹配。
对每天分别建立出点入点。分别计算出从第
我们要求的不一定是最大流,而是最大费用任意流,所以当费用为负时直接退出即可。
评测记录
- P2053 [SCOI2007]修车
某辆车先修理这一决策,不仅仅会导致这辆车花费等待时间,还会影响到排在后面的车。
我们考虑提前计算贡献。对于某个技术人员,排名倒数第
这能够让我们简化状态 : 某辆车,在某个技术人员手中,排名倒数第几。对应的贡献就是确定的。
现在就变成了一个带费用的匹配问题,跑最小费用最大流即可。点数是
评测记录(久远)
- P2050 [NOI2012]美食节
和上一题是本质相同的,难点在于数据范围增大了,不能直接跑费用流。
容易发现,如果倒数第
EK
算法每次只会找到一条增广路,我们可以每次增广之后,查看新的匹配,然后把下一个空加入即可。
这样,总点数就是
图比较稠密,推荐使用vector
。评测记录
- CF863F Almost Permutation
首先,容易把所有的限制转成某个位置的值
然后注意到值域不大,我们可以对每个位置的每种决策(匹配)分别建边。
每个点有
对于每个桶,代价并不是线性的。这也好办,类似上一题枚举代价差分即可,由于平方是凸函数,一定会先走前面的边。
求最小费用最大流即可。评测记录
本身就有
- P4307 [JSOI2009]球队收益 / 球队预算
每场比赛设置一个点,流量限制为
求出某支球队总共需要比赛的场数
考虑多赢一场造成的花费变化量 :
不难发现这个值随着
对于某支球队,算出多赢一场所需的费用,然后一条条连边,表示多赢第……场。(注意已有的胜场)
由于费用递增,费用流一定会依次按照赢场递增走边,这是一定符合状态定义的。
注意到
评测记录
- P4249 [WC2007]剪刀石头布 & CF1264E Beautiful League
题意 : 给一个部分确定的竞赛图定向,要求三元环尽量多。
我们不妨最小化非三元环子图,然后用三点子图
考虑某三点子图不是三元环的情况(请自行画图) : 某个点入度为
来到整张图中考虑,能够发现某点若入度为
对于每条未定向的边,限制流量为
对于每个端点,连向汇。此时的费用不是线性的,由于
评测记录1 & 评测记录2
- P6061 [加油武汉]疫情调查
图的最小环覆盖?
先跑一个Folyd
。
按照套路把点拆成出入点,某两个点之间的匹配可以看做将两条路径接在一起。
进一步发现,对于一个完美匹配(置换?),按照匹配连接路径之后正好得到若干个环。
那么我们在这个二分图的
这样需要
但是每个点自己成环,代价(距离)不是
源连出点,入点连汇,从入到出免费不限流量,从出点到入点(反向)需要
评测记录
-
UVA12092 Paint the Roads
题意 :
n 个点m 条带权边的有向图,要给边染色。让染色的边形成若干个回路,且每个点都恰好属于其中
k 个回路。问最少的染色边权和。
上一题的扩展,直接令每个点的出入度都为
还需要限制每条边只能染一次,这就只能建立原图并拆点了。
评测记录 (数据似乎较弱……)
- CF277E Binary Tree on Plane
容易发现可能的父子关系是一个DAG
,这就不会出现环。
观察到二叉树的每个点都必选,这就没必要限制流的连续性。(也就躲过了“分流”的难题)
将每个点拆成出入点,入点连汇,容量为
源连出点,容量为
各个点之间连边,按照欧氏距离确定费用。
最后求解(实数)最小费用最大流。评测记录
- P4068 [SDOI2016]数字配对
奇怪的题目……要求费用为正?先考虑经典的费用流。
设
由于能匹配的对子
现在有要求费用为正的情况下流量尽量大,由于经典最大费用流算法中,每次按照最长路增广,最长路会逐渐变短。
这是具有单调性的,我们只需要使劲增广直到总费用为负数即可。注意最后一次增广可能只能获得一部分流量。
评测记录
- UVA1411 Ants
注意有多组数据,不要像我一样白WA
两发。
注意到不同的方案中,关于相交的限制是不同的,多个可能的匹配之间的互斥关系十分复杂。
考虑先使用几何知识分析,若有两条相交的线段(灰色),将其调整成不相交的连接方式(黑色),长度一定会变短。
(可以使用三角形两边之和大于第三边证明)
所以,不难得到结论 : 对于一个交错的方案,必定存在一个不交错的方案,连线总长度更短。
由于题目保证有解,我们求解最小费用匹配就得到了答案。
评测记录
- P5331 [SNOI2019]通信
不难发现这是个DAG
,问题就是最小权路径覆盖。可以转为二分图带权匹配。
直接暴力建边,边数可能达到
观察到我们每次都在向一个编号前缀连边,而费用是绝对值,与
离散化之后主席树优化建边即可。具体来讲,需要维护两颗主席树,一棵点权为
连边时,向第一棵的
这样边数就降为了
[评测记录] ()
- P3965 [TJOI2013]循环格
不难发现这张图每个点只有一个出度,就是一个基环内向树森林。若满足“循环”的定义,一定是由若干个环组成。
“环森林”的充要条件就是 : 每个点都只有一个入度,一个出度,这可以视作匹配。
首先拆成出入点,各有
对于一个点,可以向四个方向(注意边界循环)匹配,若恰好是自己的初始方向,费用为
然后就是二分图带权匹配了,由于费用小建议跑zkw
。 评测记录
- P4003 无限之环
非常有意思的题目。
不漏水的要求,相当于让相邻格子之间流量尽量大。
可以给棋盘染个色变成二分图,黑的位置连源,白的位置连汇,就能让相邻格子产生流。
考虑对这些形状分类讨论。设
由于每个点可能有四个接头,我们对每个位置建立
下面对于特定朝向的形状进行分析,只需要旋转就能得到所有情况。
-
中向上连一条
(1,0) (不用转),向左右分别连(1,1) (转一次),向下连(1,2) (转两次). -
先让中向上右各连一条
(1,0) 。考虑顺时针转一次,相当于上面少了一个接头,下面多了一个接头。上向下连
(1,1) ,类似地有右向左连(1,1) 。能够发现,旋转两次的情况,流量到了左下,费用恰好为
2 ,这是自洽的。 -
先让中向上左右各连一条
(1,0) 。顺时针旋转一次,相当于左边少了一个接头,下面多了一个接头。左向下连
(1,1) ,类似地有右向下连(1,1) 。也可以转两次,相当于上面少了一个接头,下面多了一个接头。上向下连
(1,2) 。 -
发现直线不好建模,但是直线恰好不能转,直接让中向左右各连一条
(1,0) 。 -
十字形显然转了和没转一样,直接让中向上下左右各连一条
(1,0) 。
注意需要根据“中”连的是源还是汇,来确定边的方向。
别忘了在相邻的对应方格的对应接头之间连上
然后把讨论在代码里复现,求最小费用最大流。
由于费用很小,增广路较短,多路增广的zkw
比EK
快
不好归类的题目
- P2604 [ZJOI2010]网络扩容
第一问就是最大流。然后将源点的流量限制为
将每条边复制一份作为“扩容边”,容量为
评测记录(久远)
- P2517 [HAOI2010]订货
从第
从源连第
从第
求最小费用最大流即可。 评测记录
奇怪的是 DP
解法……建议加强到
- P3358 最长k可重区间集问题 & CF164C Machine Programming
很像朴素的匹配问题 : 每段只能匹配
我们向每个区间连边,问题来了,对于一段区间我们不好限制必须要整体选择。
一个关键的性质是 : 可以把最优解划分成选择若干次不交的区间集合的形式。能够发现选择
考虑每个区间拆成出入点,之间容量为
按左端点排序,每个区间向着后面不交的区间连边,容量为
注意到“不交”具有单调性,我们给每个区间入点到下一个入点之间新增一条边,容量为
这样就只需要向着后面第一个不交的区间连边了,边数降为
容易发现,一个流的意义就是选择一个不交的区间集合。
然后每个区间的入点都连源,容量为
求最大费用最大流即可。
评测记录1 & 评测记录2
- P3357 最长k可重线段集问题
和上一题就两个区别 : 长度的计算方式变了。有可能出现垂直于
我们将所有的位置
评测记录
- P3980 [NOI2008]志愿者招募
神仙题.jpg
同样很像朴素的匹配问题,考虑对每天建立点限制流量,发现志愿者只能够向一个区间整体贡献,不好处理。
换一种方法建图,将每天串起来。
考虑只有一种志愿者怎么办,显然需要
而我们的网络流,串联边的规则是流量取
最终的目标就是让最大流达到
考虑志愿者能够提供怎样的帮助 : 给
我们就可以从
然后跑一个最小费用最大流即可。评测记录
有另一种更加循规蹈矩的方法,通过线性规划推式子转费用流。
设
不等式不便分析,考虑添加松弛变量变为等式,设
将第
考虑容斥,
如果我们把每个式子看做一个点,正数表示流入,负数表示流出,等式就代表着流量平衡。我们能得到如下的建图方法。
-
(类似上下界网络流)钦定每个点的流量总和为常数
A_{k-1}-A_k 。根据其正负,从源或汇向点k 连边。 -
观察到
D_k 会在k+1 处正一次,在k 处负一次,从k 向k+1 连边,容量为\inf ,表示D 。 -
观察到
X_i 会在l_i 处正一次,在r_i+1 处负一次,则从r_{i+1} 向l_i 连边,容量为\inf ,费用为c_i 。
然后就是最小费用最大(可行)流。由于未知的原因,比上一种方法明显低效。评测记录
- CF802C Heidi and Library (hard)
神仙题.jpg
观察一本书的行为 : 若
“持有”这一状态不包含流量的改变,不好建模。不妨考虑叠缩,视作可以在昨天售出上次供给的同类书,并且总会再次购入。
这样就使得我们的策略一定合法。
将每一天拆成 : 售卖处
每天的顺序是: 先卖,再买,然后回收。
-
-
-
设第
i 天上一次需要同样的书是第j 天. -
-
-
注意,一定要先卖后买,这样才能限制一定是旧书,防止买完就卖。
不难发现,可以将
观察这个模型,若某本书当天没有被扔掉,一定会一直待在书架里占用位置,直到被卖掉。
求最小费用最大流。 评测记录
我们巧妙地在回收站包含了信息,而利用题目中的要求必须满足的性质将状态缩减,把不同的书当做同样的流量处理。
类似的题 : CF132E Bits of merry old England & [评测记录] ()
输出方案的话,记录下每个售出和购入,将能串的串在一起,然后按时间顺序扫描即可。
3.上下界网络流题目泛做
可能会用
用
- P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流
考虑对每天分别拆点,流量限制为
然后跑有源汇上下界最大流即可。评测记录
- P4843 清理雪道
观察“每条雪道至少被清理一次”的要求,相当于流量至少为 DAG
并将限制设为
接下来就是有源汇上下界最小流。
评测记录
- P2304 [NOI2015]小园丁与老司机
第一问考虑DP
,注意到可能的路径并非DAG
,需要仔细考虑。
能够发现有每个
设
转移让前面的树贡献,每棵树只会有“上,右上,左上”三种转移方式。拿桶搞一搞就容易得出转移目标。
接下来是同行转移,我们可以非常暴力地枚举进入点和离开点
设一行的点数为
注意,对于每次转移,还需要记录最优方案。反向递归这些方案回答第二问。
我们按照转移顺序反向标记出那些点可能达到最优解,找出所有包含在最优转移中的“左上,右上,上”边,它们组成一个DAG
。
接下来就是上一题了,求有源汇上下界最小流即可。
[评测记录] ()
- P4043 [AHOI2014/JSOI2014]支线剧情
有源汇上下界最小费用可行流。
每条边至少被经过一次,流量限制就是
然后把有源汇上下界可行流套上费用流就做完了。(注意要计算初始流的费用)
评测记录
- P4553 80人环游世界
容易发现只是在P4043
的基础上把点的容量限制定死了。
评测记录
- P2469 [SDOI2010]星际竞速
由于引力大小的限制,若只考虑高速航行,这图是个DAG
。
能够发现,空间跳跃的花费和起点无关,我们可以将方案等效抽象成以从起点跳跃开头的若干条路径。
于是就可以转化为和上面类似的DAG
遍历问题。
求最小费用可行流。 评测记录
由于限制点不相交,还能转化成最小代价路径覆盖。
首先让每个点自成一条路径,此时代价是
仿照最小路径覆盖,建立二分图,一条匹配边就代表将两条路径合在一起。
所以从
但此时我们求的并不是最小费用最大流,而是最小费用合法流。
由于费用流中最短路一定会逐渐变长,我们只需要增广直到最短路为正即可。
比起上一种方法,不需要上下界,代码更短,跑得也要略快一些。评测记录
- P4542 [ZJOI2011]营救皮卡丘
去日本旅游的黑猫警长xswl
反正所有的据点最终一定会被干掉,多条路径之间,我们不需要关心相对顺序。
只需要限制每条单独的(摧毁)路径必须按顺序进行,最后把各个路径归并一下即可。
问题在于,目前占领了多少据点,可能影响到我们走的最短路。
先使用 Folyd
预处理出
如果一个人上一次摧毁
然后就是一个DAG
的最短
同样也可以使用费用匹配求解路径覆盖。这里
评测记录
- P4311 士兵占领
直接建立矩阵对应的结构不好做,考虑从行“剥离”总和贡献到列。
给每行每列都建立一个点,有容量下界限制。
对于B
点,要求入流量(B
)严格大于出流量(R
),则连边
-
对于右半部:
对于
R
点,要求入流量(R
)严格大于出流量(B
),则连边(B,T,[1,\inf],0) 对于
B
点,要求出流量(B
)严格大于入流量(R
),则连边(S,R,[1,\inf],0)
对于U
点,总是无要求,则连边
然后求最小费用可行流,费用只有两种,多路增广会快。 评测记录
- CF708D Incorrect Flow
对于原图的边
-
若
f\leq c -
反向流动 : 容量为
f (真正的流不能小于0 ) ,费用为1 。 (代表f--;
) -
正向流动① : 容量为
\max(c-f,0) (无需调整c 的部分) ,费用为1 。 (代表f++;
) -
正向流动② : 容量为
\inf (需要调整c 的部分) ,费用为2 。 (代表f++,c++;
)
-
-
若
f>c 能够发现至少有
f-c 的花费,这部分预先计算,便于后面的分析。-
反向流动① : 容量为
f-c ,费用为0 (被预先计算)。 (代表f≤c
之前的f--;
或c++;
) -
反向流动② : 容量为
c (真正的流不能小于0 ) ,费用为1 。(代表f≤c
之后的f--;
) -
正向流动 : 容量为
\inf ,费用为2 。(代表f++,c++;
)
-
对于原图中已有的流量,连边
求上下界最小费用可行流即可。
评测记录
- CF704D Captain America
不妨设
考虑给每行每列分别建立点,一个
绝对值的限制可以视作上下界,跑上下界最大流即可。
出题人有点猛,直接搞了
评测记录
- UVA1104 芯片难题 Chips Challenge
-
任意行或列的部件数不能超过整个芯片总部件的
A/B 这个限制。没有什么好的处理方法,也不存在单调性,只能考虑枚举芯片总部件数,这样能够确定行和列的限制。
现在转化成了若干个这种问题 : 限制每行每列最多
lim 个,问最多能放置多少个。直接枚举需要
O(n^2) 次判定,太慢了。考虑我们枚举的芯片总部件给了这张图传了什么信息,不难发现就只有对于行的限制。
而行的容量最多
n ,我们直接O(n) 枚举这个限制,然后算出合法的总部件数就好了。
-
用经典的网络流并不好直接控制,可以使用循环流。 每行每列拆一个点,行列之间按照能放元件的位置连边 : 若已经有元件,则流量限制为 $[1,1]$ 。若没有但是可以放置,则流量限制为 $[0,1]$ 。 最后,从列向行连一条边,限制为 $lim$ ,这样可以保证从列流出多少,行就要收回多少,且一行的流量不超过 $lim$。 图大概是这样子,要使得满足流量守恒的户条件下,红色边的总流量尽量大:  给红色边加 $1$ 的费用,问题就可以转化成最大费用循环流了。注意要使用技巧处理掉正环。 由于费用只有 $0,1$ 最短路可以 $O(n)$ 做,并加上多路增广。 由于流的总量是 $O(n^2)$级别的,估算了一下复杂度上界为 $O(n^4)$ ,这就很稳了。
提交记录
还有一种不需要神仙模板的人类智慧做法。
注意到我们如果仅仅把放置当做流量,“能否放置”和“行列等量”很难兼顾。
不妨把放置和不放置都记作流量,然后给放置附上费用引导决策。
行列分别建点,形成二分图。源连行,列连汇,容量
第
对于可决策的区域
对于必须不放置的区域
接下来可以选择使用上下界,限定流量恰好为
另外一种神奇的做法是 : 容量为
如果满流,且所有
提交记录
随手一写居然两种做法都1A
了,有点感动。
-
UVA1659 帮助小罗拉 Help Little Laura
题意 : 给定一个平面上的一些有向线段,涂色费用为
dx-y , 其中d 为边的长度(实数),x,y 为给定参数。环路的涂色费用为各边涂色费用和。找出一些环路,使得这些环路边不相交,且涂色费用总和最大。
最大费用循环流的模板题。直接求解最大费用无源汇可行流会遇到正环,可以使用和“负环费用流”类似的方法。
也即 : 把原图的
意思就是先把所有的正权边强制流满,然后建立反向边来退流。
接着就是上下界无源汇最小费用可行流,不难发现图中没有正环了。
这个题浮点数不开SPJ
,手动加1e-7
才能通过……
评测记录