command_block
2019-08-13 13:34:45
请配合 : 网络流/二分图相关笔记(干货篇) 食用,否则可能无法理解某些内容。
可能会用
把流当成移动,路径,选择等等之类。
P2472 [SCOI2007]蜥蜴
题意 : 一个矩阵中有若干个石柱,每个石柱都有自己的耐久度。
现在有一些蜥蜴站在部分石柱上,蜥蜴可以跳到欧几里得距离不超过
蜥蜴每次起跳,脚下的石柱都会失去一点耐久,耐久为
问最多能有多少条蜥蜴能够跳出边界。
把蜥蜴的移动当成流,耐久当成容量。
每个石柱需要限流,拆成出入点,之间连上限制。
蜥蜴一开始待在入点。从原点向有蜥蜴的入点连边,容量为
根据跳跃条件,从出点向其他石柱的入点连边,容量为
能跳出边界的地方,出点向汇点相连,容量为
评测记录
先用朴素DP
求出
然后查看
每个位置拆点限制流量为
然后将
评测记录(久远)
发现在时间不同时,能走的转移是不同的,考虑按照时间分层。
如果在对应时间有一辆飞船从
可以证明,若有解,每经过
我们可以枚举时间,每次新增一层然后增广,如果超过
评测记录
首先,往返可以看做走双倍次数。
我们按照桥的容量建边,然后分别限制两个源汇的流量,这些都是经典操作。
现在跑最大流,出现了两个问题:
①可能有些流从
②我们只能限制有向边的流量,可能某些危桥从两个方向都经过
难以通过精妙的建模规避掉这些问题。奇妙的是,直接将
①先在
交换
不妨设
若两次最大流任意一次不满,则肯定无解,这是充要条件。
②容易发现,同一个源流出的流量不可能从两个方向同时经过一座桥。
危桥从两个方向都被经过,只有可能是
那么交换
评测记录
容易发现,每节蜈蚣的最优决策都是相同的,我们直接把
对于每种光明程度,分别建立一个点,源点连
能够发现,所有的操作都是从一个区间连向另外一个区间,使用一上一下两颗线段树加虚点优化建边即可。
点数是 Dinic
求最大流就已经足够快了。
评测记录
这类问题把源当做物品,把汇当做盒子,流的意义是匹配(决策)。
二分图的定义见第二节。
我们把左部点设为源,右部点设为汇。每个点只能连一次,所以源汇的容量都是
把多个点变成源并限制流量 : 从大源给每个小源分别连一条钦定流量的边。
连边可以变成左部点到右部点的一条有向边。
容易理解这些流和匹配是等价的。
有一个结论是Dinik
跑经典二分图匹配的复杂度是
评测记录
把在学校的人匹配到床上,如果最大匹配
具体方法:建立二分图,左边是人,右边是床,每个人向能用的床连边。
评测记录(久远)
P2763 试题库问题
题意 : 你有
右侧带容量的二分图匹配。评测记录(久远)
能发现等价于两侧都带容量的二分图匹配。评测记录(久远)
考虑二分答案
现在的问题是能否找出
这可以看做一个二分图匹配问题,行和列分别为左右部点,若某行某列能放置则连边,这样就能满足“一行只对应一列”的条件了。
评测记录
先跑Folyd
。然后二分时间
我们要把牛分到牛棚里面去,直接二分图匹配即可。
评测记录(久远)
仍然考虑二分时间,判定条件变成了最大匹配
每个点上的士兵只能留在自己,或者向相邻的点移动。考虑拆成出入点变为二分图。
从源点连向入点,容量为初始时的人数。从出点连向汇,容量为结束是的人数。
然后对于每条边,从对应入点连向对应出点,边权为
求最大流。如果初始和结束的总人数不同,或者不满流,则为无解。否则查看反向边的流量输出构造。
评测记录
差分一下能够发现,这些限制本质上是把
对于每一段,限制总流量为数的个数。我们分别计算模
如果最大流是
评测记录
考虑二分或者枚举,问题转化成判定所有人都赢不超过
给每场比赛新建一个点,从源连一条边,限制流量为
每个人连向汇点,流量限制为
构造方案可以查看比赛的流给了哪一方。
评测记录
P1231 教辅的组成
题意 : 这是一个三分图。第一层和第二层之间有若干对应关系,第一层和第三层之间也有若干对应关系。同层之间无关系。
如果找出三元组
如果每个点只能用一次,求最多能组成的好的三元组的个数。
初看起来像三分图匹配,但是由于二三层之间无关系,还是能够网络流解决。
把第二层连汇,第三层连源,权值为
容易发现一条流就对应一个好的三元组。
评测记录(久远)
先考虑没有硬石头的情况。相当于不能在同一行或同一列放置两个炸弹。
类似P4251
,可以看做一个二分图匹配问题。
若考虑硬石头,可以视作把完整的行/列分成了若干互不影响的段,我们按段的编号建立二分图即可。
评测记录
这是个方格图,先黑白染色变成二分图。若没有人类不杠的限制,直接跑二分图多重匹配即可。
能够发现,若不杠又需要两个邻居,一定是一横一竖。我们只需要把人类拆成两个点,一个接一个横,另一个接一个竖即可。
查看匹配情况输出方案。 评测记录
先考虑
建立二分图,左侧是男生,流量为
然后跑匹配,如果满流说明答案可以达到
接下来考虑
男生拆为三个点 :
连接
连接
对于女生建图方法类似。
然后在
评测记录
时间这种自带
二分之后,每个激光武器就相当于针对每个机器人拥有了一定量的“输出值”可以随意分配。
具体地说,每个激光武器的初始容量为
如果最大流满流则说明可以在 long long
。
评测记录
这是个方格图,首先考虑黑黑白染色。每次我们只能对一个黑色的格子和一个白色的格子同时
设白色的位置有
那么需要的操作次数是
听过简单的变形得到
若
若
满足单调性,可以二分,现在我们的任务就是判断某个
我们可以计算出每个点需要加多少次,不难发现两个位置都加一的规则就是二分图带容量匹配。
评测记录(久远)
神仙题.jpg
同样先乘以
这样我们就得到
我们按照时间段分层,每层中老鼠能够吃的奶酪就是确定的,每只老鼠能够吃多少奶酪也是确定的。
然而现在还有吃奶酪一对一的要求,这里的流量参差不齐,无法像经典二分图匹配那样自然做到一对一。
设某块奶酪在某一段时间 ( 设长度为
注意到时间区间不交就等价于要求
这是对所有老鼠共同的限制,如果让每只老鼠分别占用一个点,就不好控制。
先列个式子,这一段内被吃掉的总体积为:
(不妨按照
可以看出,第
注意到
通过旧意义下的方案,直接根据那个和式就能得到新意义下的方案。
根据一组新意义下的方案,我们能差分得到
直接求最大流即可。评测记录
考虑把每个点匹配给自己的父亲,建立二分图,左侧为出点,右侧为入点。
考虑二分/枚举,接下来就需要判断负载级别为
每个点只能有一个父亲,于是限制左侧容量一律为
注意,控制中心的流量不受限制。如果满流则有解。
接下来考虑字典序,不难想到逐位贪心。先钦定若干匹配,然后在剩下的图中跑匹配,看看是否满流。
逐位枚举,需要
[评测记录] ()
我们考虑将选手匹配向导师。
同阶志愿对于某个选手是没有区别的,所以可能存在后面的选手让前面的选手反悔的情况。
对于每个选手,逐次检查每阶志愿中是否有可能空位,若有,则连向该阶志愿的所有导师并增广。这会留下反向边,自然处理了反悔操作。
现在问题在于如何判断某个导师是否可能有空位。等价于问某个导师的点到汇点是否有增广路,从汇点反向搜索即可(注意,图上有环,不能瞎搜)。
这样需要 BFS
,复杂度上界是
接下来是第二问,不难发现某个前缀所造成的导师“填满”状态是固定的。
二分一下新的排名,然后查看是否能满足要求即可。这部分复杂度是
评测记录
这是一个经典的车放置问题,可以二分图匹配解决,但是连
考虑优化建边,不难想到主席树+扫描线,这样点数和边数都是
另一种更加牛逼的做法是 : 利用题目中黑矩形不交的性质,从每个矩形的上下边界向外延伸(遇到障碍就停止),能够将整个图的空位剖分成
_______________________
###________________
###___________##
### #### ##
____###_____####__##___
____________####_______
空矩形只有
对于每个空矩形,相当于从左部点的一个区间连向右部点的一个区间,我们分别维护两颗线段树即可。
这样边数还是
至于这些矩阵怎么划分,反正
神仙题,找不到题解,看wxh
神的代码学了一下 /kel。看不懂结论,咕咕。
https://codeforces.com/contest/212/submission/34274620
对于一个棋盘,像国际象棋那样染成黑白两色,容易发现这是个二分图。
由于这类题实在太多,这个套路又比较简单,就不单独归类了。
P2774 方格取数问题
题意 : 给出一个带权值棋盘,相邻的两个东西不能选,问能选的最大总和。
把网格像国际象棋那样染成黑白两色,容易发现这是个二分图。
这里“不能选”的限制有点类似割,我们考虑最小割。即割的尽量少,保留的尽量多。
相邻的不能选,相当于割断二分图。
我们把中间边设为INF
,这样不会被割掉。
然后源汇均按权值连边即可。
评测记录(久远)
根据 Kruskal
,其他边
考虑 Kruskal
的排序建立过程,把小于
使得某条边
评测记录
和上一题类似,甚至不需要推结论。
对于最小生成树,取出权值小于关建边的边跑一次最小割。
对于最大生成树,取出权值大于关建边的边跑一次最小割。
评测记录
建篱笆就是最小割,源连狼,羊连汇,容量为
评测记录(久远)
可以让源连南南的房子,强强的房子连汇,容量均为价钱。
每个格子向四连通的方向连对应墙代价的边。
能够发现,一个割就对应着一种合法的方案。(割了房子就代表不卖,割了墙就代表造墙)
将所有可能的收益求和,减去最小割即为答案。 评测记录
注意到意见只能有两种,我们可以以
朋友之间连一条双向边,权为
对于持有
求出最小割即为答案。评测记录(久远)
P3227 [HNOI2013]切糕
鉴于题目很不好懂,特别解释一下题意 :
有一个
目标是将这个蛋糕切成上下两块。
对于每一竖轴,以
那么,对于四相邻的竖轴,其
目标是使得
我们把蛋糕下表面的点连上源,上表面的点连上汇,这就是一个最小割问题。
如何控制
我们可以从某个
这样,如果两个相邻轴的
若两个相邻轴的
按照上述方法建图后求最小割即可。 评测记录
不难发现一套题可以整体处理,首先计算出第
接下来就是一个分配问题,但是还有若干 “第
不难发现和上一题十分相似,我们可以想办法让差超过
点
接着,对于一个限制
若
能够发现,若最终割掉的两个位置是
求最小割即可。流量过大则表明无解,注意适时break;
评测记录
这是一张密铺图,虽然不能像方格图那样染成两色,但是能按照
观察发现,共振总是恰好包含三种颜色的水晶各一个。要用最小的代价“割断”共振。
可以看做一个三层图,有若干个限制,每个分别选取每一层的一个点组成三元组
一般的情况不太可做,随手建了个模得了
观察限制的特殊性,发现能量源的地位十分特殊。
将两种共振综合考虑并讨论,能发现等价的约束 : 某个能量源若存在,其周围最多只能有一种颜色的点。
不妨称能量源为红色,另两种为黑白。则从源连向黑点,从白点连向汇,容量为点权。
接下来,对于一个红点,拆成出入点,中间连边,容量为点权。对于相邻的黑点,连边到入点,对于相邻的白点,从出点连向它们,边权均为
不难发现,该图的割的条件和转化后的约束等价。
接下来就是最小割了。一些细节 :
std::map
检索。评测记录
仍然是一道奇怪的题目。
发现四种形状都恰好包含一条蓝色竖线和四个格子,那么不妨把方格图染成四色,使得每个形状恰好含有四种颜色各一个。
经过一阵手玩之后,染成了这样:
有了上一题的教训,我们不拆分,综合考虑这些限制,发现等价于要求下列子图中,四种颜色不能同时存在。
那么我们按照右侧的方法建边,就能限制至少割掉一种颜色。
接下来就是大量染色和连边的细节,就不赘述了。
最后求最小割,由于图近似二分图,
若一个人在
先不考虑竞争。从源点给每个人连边
考虑
接着考虑竞争,这会令
接着就是求总收益减去最小割( 需要long long
),由于边非常多,可能需要卡常。 评测记录
P1361 小M的作物
题意 : 把若干个物品分配到
同时,钦定若干个物品集合一并丢到某个盒子里面的额外收益。
用最大流的思路并不容易建模。注意到这里只有两个盒子,选某个盒子可以看做割另一个盒子。
首先建立一个不考虑集合的图。可以把每个点串联
不难想到
现在考虑集合,对于某个集合,如果其中某个点的
我们可以考虑把集合
这样,我们对每个集合建立
然后连边到对应的物品上,边权为INF
防止被割。
如果要割掉任意一个物品边,都必须要割掉所对应的所有集合边,否则白割。
整张图是对称的,对
由于图很稠密,写vector
会快一点(2
倍速左右)
评测记录
棋盘和四连通是吓唬人的,根本不需要黑白染色,其实就是 P1361
。评测记录
棋盘和四连通又是吓唬人的,其实就是 P1361
。评测记录
其实就是 P1361
,只不过多了个倒贴钱。评测记录
这是个四连通网格图,先黑白染色变成二分图。
不相同才有奖很不爽,直接交换右部点的
然后就是P1646
了。评测记录
模仿P2766
,首先还是DP
求出LIS
。
画出最优转移的DAG
,我们的目标就是把这个DAG
割了。
每个位置拆点,点权为
考虑构造一组字典序最小的最小割,一个简单的想法是逐位贪心,但是(就算使用二分)仍然需要求
回忆上文“最小割的必须边和可行边”。
我们可以先安排一个
一种暴力的想法是,删掉这条边,重新跑一次最大流。这需要
我们考虑在原网络信息的基础上进行调整。
接下来引入一种重要的操作 : 退流。
观察删去某条边
考虑调整,不难发现从
这样仍然需要
能够发现退流往往只会涉及部分网络,最好使用不完全BFS
优化。
前面提到,可以缩SCC
求可行边,但是这题的图在不断变化,只好直接暴力搜索,查看是否有增广路。
搜索的复杂度上界是
评测记录
首先有一个显然的最大流解法 :
然而数据范围很大,就算使用区间数据结构优化建边也过不去。
注意到图很特殊,我们考虑使用DP
求解最小割,就能得到最大流。
设
若在
若在
转移方程 :
最后
暴力求解(需要滚动数组),复杂度为
设最终方案为集合
不妨令初始状态为所有点都在
若将
要割的边数
若都是
现在已经有
不难发现,关于
我们把
加入的过程中,每种状态都是一个合法的割。
考虑如何让这个过程中产生的割代价“最低点”最小,显然应该先加入权值尽量小的点。
按照权值排序贪心即可,复杂度
P3410 拍照
题意 : 有
给出若干个悬赏
经典问题。元素必须集齐可以转化成闭合子图条件。
每个悬赏点权为奖励,出边连向所需的所有元素。这样,由于图闭合,想获得奖励,所有这些元素都必选。
元素的点权为(负)自己的代价。跑最大闭合子图模板即可。
评测记录
希望构造方案请见 P2762 太空飞行计划问题
P2805 [NOI2009]植物大战僵尸
发现不会做这道题是写作本文的动力之一。
题意 : 一个网格图上,有若干个法阵,每个都有其防御位置集合。
我们可以从地图右侧发射光球,向左飞行。如果光球途径某个(未摧毁)法阵的防御范围,则会被吸收而不能起到攻击作用。
对于一个法阵,如果其能源参数为负数,则表示摧毁这个法阵需要付出能源,否则表示能收益能源。
问在这次攻击行动中,能获得多少能源的净收益?
而要想摧毁一个法阵,必须要把防御它的其他法阵都干掉,则对应“出边必选”的闭合条件。
由于光球只能向左飞行,摧毁一个法阵需要摧毁之前的所有法阵,可以认为每个法阵会保护身后的一个。
我们将每个法阵向防御它的所有法阵连边,然后求最大闭合子图即可。
问题在于可能有一些法阵互相保护,这些法阵就相当于无敌了(和经典的最大权闭合子图不同),被它们保护的其他法阵也无敌了。
可以在反图上拓扑排序取出没有无敌效果的点。
评测记录
能够发现, 若打碎第 DAG
,排个序看看就得到了)
然后我们可以从
注意需要开long long
。 评测记录
某个用户能贡献当且仅当其使用的两个基站都建造,最大闭合子图模板题。评测记录
选某条边一定要选两个端点,变成 P4174
。评测记录
首先把式子化一化 : (不熟悉线性代数是不是就跪了啊……)
能够发现,如果选择
搞了半天原来还是同一个题,直接最大闭合子图带……走? 点似乎有
考虑到该类问题的特殊性(
若
对于一组
在最小割中,如果想要仅用
考虑每种情况中割掉的边以及对应的损失,能得到方程组:
解这个方程组,发现没有产生矛盾。解得:
上面是两个点的情况,现在考虑多个点的情况。
为了避免小数,把流量扩大一倍,求最小割即可。
评测记录
前面的几个题也都可以如此减少点数到
首先能够发现,由于可以取多次,每次只取一个区间的限制可以忽略。
观察代价计算方式,每种代号的寿司,只要吃任意一种,都会带来
而观察
注意到
( 分别向每个寿司连边不仅效率低下,由于
然后,对于代表单种寿司的
求最大权闭合子图即可。评测记录
一种扩展的最大闭合子图。原先是要求一定闭合,现在可以花费某种代价删去一条有向边的约束。
仍然考虑类似的建图,正权点连源,负权点连汇,有向边的边权不再是
答案仍然是正点权和减去最小割。评测记录
若不存在租用,完成一项工作必须购买对应的所有机器,这就是个经典的最大闭合子图问题。
接着考虑租用,可以类似上一题,将租用视作花费一定代价忽略某条边的闭合限制。
即 : 从每个工作向对应的机器连边,边权为租用费用。然后求解扩展最大闭合子图。
评测记录
容易发现,题目中给出的特殊性质就是
所以我们建立二分图,左侧是集合,右侧是元素,集合向其中的元素连边,一定有完美匹配。
任取一种完美匹配,不妨设集合
我们取
若子集等于并集,这就是一个合法解,若并集更大则不合法。考虑如何限制,不难想到利用闭合子图。
让集合向着所包含的元素连边(强制选并集),元素沿着完美匹配向着集合连边,求最小权闭合子图即可。
评测记录
首先可以手玩一下,能够发现一个图合法的必要条件 :
这是比较显然的,
接着,我们猜想 : 若每个子图都满足
证明比较神仙,看这里 : http://jiry-2.blog.uoj.ac/blog/1115
考虑给边赋权 CF1082G
,得到权最大的子图。
若这个权大于
但是注意道我们总是可以选择空集,所以总是得不到负数的结果。也就是说我们真正想求的是“最大权非空闭合子图”。
可以采用比较暴力的办法,直接枚举必选那个点(容易发现只需要枚举“点”),然后给剩余的部分跑一遍完整的最大权闭合子图。
由于这是二分图,复杂度是
每次都重新跑十分浪费,注意到删除一个点只是相当于删掉了右部点到汇的一条容量为
我们一开始做一个二分图匹配,每次直接把被删除边的流量退掉即可。
由于流量很少,复杂度是有理有据的
观察到只能向下移动,这是个 DAG
,然后求解(点不相交)的最小路径覆盖即可。
评测记录
发现按时间分层点数太多无法承受,注意到任务数量较少,而且都以绝对时间标定,不妨将任务看成状态。
先使用 Folyd
(注意维修时间)求出两两最短路,然后将每个任务连向完成后(注意必须直飞)还来得及接的其余任务。
按起飞时间排序,我们能发现这是个DAG
,跑最小路径覆盖即可。
评测记录
考虑二分,每次判定能否答完价值低于
问题转化成 : 给出一个DAG
,使用允许相交的
搞个传递闭包就转化成可相交链覆盖了。
由于点数较少,也可以直接枚举并加边。评测记录
首先能够发现,包含关系是一个偏序集。
建立AC
自动机,众所周知,fail
树中,祖先是儿子的子串。
暴力跳fail
连边复杂度是dfs
遍历fail
树会爆栈)
一个比较好的方法是,每个点向最近的一个祖先连边,然后传递闭包。
然后就变成了最长反链问题,复杂度为
比较平凡的二分图匹配除外。
能够发现影响是二分图。(国际象棋中,骑士走一步,落脚点和起点的颜色一定不同)
然后求解二分图最大独立集。
评测记录
容易发现横线段互不相交,竖线段互不相交,这是个二分图。
选出互不相交的尽量多的线段,等价于二分图最大独立集。
评测记录
题意就是让我们求解朋友关系的最大团。在一般图中,这是个NP
问题,我们需要利用本题中图的特殊性质。
观察
观察
出题人比较憨逼,给这么大的数据范围,然而造得很水,我们可以随手加几个剪枝用Dinic
跑过去……
评测记录
发现没见过类似的模型,直接做比较困难。
不妨对答案方案取补,限制就变成了 : 每个点最多被连接
我们求出(带容量的)最大匹配,然后取补就能得到最小的
对每个
评测记录
注意到代价是
现在问题就是,对于每个黑点,要么所在的行被涂黑,要么所在的列被涂黑。
这能够转化成二分图最大点覆盖问题 : 行在左边,列在右边,黑点是中间的边。
但是正方形网格非常大,黑色矩形却很少。
考虑暴力离散化得到
评测记录
将居民和守卫看做二分图,居民对守卫的要求看做边。不难发现这个二分图的最小点覆盖就是答案。
显然
构造方案需要按照割集查看,不能直接利用二分图的性质了。
评测记录
这是个方格图,首先黑白染色变成二分图。
现在就把问题抽象成了一个二分图博弈 : 可以自行选取起点,通过二分图上的边移动,并将该边删去,不能移动者负。
先求出一个最大匹配,假设先手选在某个非匹配点开始。
那么,若没有出边,则后手负。若有出边,则后手必定来到匹配点,否则可以增广。
接着,先手可以走匹配边,这样又变成了后手到达非匹配点的局面。
若有出边则后手必定来到匹配点,否则产生交错路,可以增广。
先手总是可以走匹配边,后手必败。
而最大匹配可能有多种,某个点只需要在其中任意一种不是匹配点,先手都有必胜策略。
接着说明其他的点都是先手必败。这些点必然总是匹配点,那么后手操作一次之后就总是变成先手到达非匹配点的局面,先手必败。
所以我们求出所有可能的非匹配点,即为答案。
大多数人都是用的匈牙利,所以判断非匹配点在二分图上dfs
一下偶路径就好了。
网络流也不是不能做,枚举每条满流边,把流量退掉,查看是否存在新的增广路。这可以搜索出
总复杂度就是
可以二分图匹配做,但是数据范围太大,观察到只需要判定是否有完美匹配,考虑Hall定理。
每次操作会增加
能够发现 : 左侧选择连续型号的人,能够使得连向右侧的点集尽量小。
也就是说,我们要求左侧对于任意的
令左侧的每个点点权减去
线段树维护最大子段和查看是否
评测记录
考虑二分,然后转化成了判定二分图是否有完美匹配。
先拆环为链,距离不超过环长的一半,这是合法的。
和上一题中类似,选择连续的 boy
,能够使得连向 girl
的点集尽量小。
设 boy
最靠左能匹配到的 girl
编号,
对区间
前缀
[评测记录] ()
对于
将
类似地,选择
对两个序列前缀的限制可以等价为 :
先离散化,每个
事先将
评测记录
可以按照字典序贪心,但是可能导致后面没东西填,产生后效性。
填写每一位之前,可以先判断一下后面的位能否形成完美匹配,如果能才填写。
具体的讲,每个字母按照数量限制流量,右边连向每个位置,跑二分图带容量匹配看看是否满流即可。
但是这会需要
又能发现字符串上的一个位置最多只有
观察填写一个位置可能造成的影响 : 一个右侧点和一个左侧点容量一并减少
那么,可以每次填写后
暴力维护一下子集求和就可以
评测记录
AT2645 [ARC076D] Exhausted?
[??记录]AT2645 [ARC076D] Exhausted?
CFgym102268D Dates
暂咕。
建立最小割树,枚举源点暴力 dfs
求每两个点之间的最小割即可。评测记录
做法同上,注意行末不能有空格。评测记录
把最小割树的边权丢进 std::set
然后输出 size()
即可。评测记录
安全系数其实就是最小割。一个点集的最小割等于其中任意两点的最小割的
建立最小割树,问题变为 : 选择一个点集,在满足权值和
这可以把最小割树中的边按权值从大到小依次加入,使用并查集维护最大的联通块权值和。离线从小到大回答询问。
评测记录
建立最小割树,相当于在树上按一个排列移动,求路径
考虑限制最紧的一条边 : 权值最小的那条边。
我们要尽量少地经过这条边,至少经过一次,也容易构造出这个下界。
然后,我们这条边删去,得到两颗子树,变为子问题。
合并时将两棵子树的排列直接接在一起即可,接口上恰好经过一次权值最小的边。
这部分复杂度
可能会用
注意到点不相交的限制,拆点并限制流量为
评测记录(久远)
没有点不相交的限制,但是每个点只能贡献一次。
把每个点拆成出入点,之间有两条边,一条只能走一次,但是能贡献费用,另一条可以走无穷多次,但是费用为
原图的边不限流量,无费用。
然后跑最大费用最大流即可。(增广路较长,费用范围大,图稀疏,不使用zkw
的一例)
评测记录(久远)
拆点,之间的边费用为点权。
限制① : 点限制流量为
限制② : 点不限流量,边限制流量为
限制③ : 点和边均不限制流量。
评测记录
我们将每个位置拆成出入点,先连上INF
边,若有石块,额外连一条容量费用均为
容易发现这是个DAG
,原图的边不限流量。求最大费用最大流即可。
主要难点在于输出方案,通过比对原图和残量网络能够得到每条边被多少辆车子经过。
评测记录
和上一题差不多,只不过贡献在边上,而且变成了多源多汇。(甚至不需要输出方案)
评测记录
我们考虑让一个流代表一个子序列,那么流只能从左往右,这是个DAG
。
要长度总和尽量大且不交,非常套路地把每个位置拆点,限制容量为
直接按照题目中给出的限制向后连边,可能会产生
能够发现,对于模
对于
求最大费用最大流即可。评测记录
考虑差分建边,也就是给每条边的每单位流量单独建边,容量为
第
这样,如果流了代表流量
由于平方的凸性,最小费用流一定会先走代表流量低的边,这就保证了合法性。
由于容量很小,直接建就好了。接着就是最小费用最大流的模板了。
评测记录
来了个真正的按时间分层费用流。考虑一条链的最差情况,容易证明时间消耗最多
原图的边有平方代价,可以差分一下变成多条边(都是套路)。直接建立所有的边,边数会达到
由于选择边的单调性可以动态建图(类似P2050
),边数可降为
连
这样,一个点完整地从
需要求解最小交换次数,可以给每条边附加
还有个问题,如果某个点原来有黑棋,后来没有,或者原来没有后来有,必然产生一次“只入”或“只出”。
如果
然后源点向原来的黑棋
各个位置之间按八联通规则连边,跑最小费用最大流即可。
评测记录
观察数据性质,已经给出了满足三角不等式的费用和时间矩阵,也就是说我们直飞一定是最优的。
容易想到根据时间分层,但是点数太多效率低下。
观察到请求数量不多,且都由绝对时间限制,这就说明两个请求之间的关系是确定的。
我们给每个请求建立一个点,容量为
然后查看所有其他请求是否来得及接,如果来得及,连边费用为
注意也要与基地连边。
求最大费用最大流即可。评测记录
这是个经典的带权二分图匹配问题,在中间的匹配边上加上费用,最大费用最大流即可。
由于图较为稠密,且增广路一般较短,建议试试zkw
费用流。
评测记录
多了一问 : 二分图带权匹配的必须边。
懒得分析,由于数据范围小,可以搞一些比较暴力的解法。
直接暴力枚举所有目前在匹配中的边,删去查看带权匹配是否减小。这样需要
原来还搞了个
加入了流量,带权多重二分图匹配。 评测记录
先搞个01
分数规划,将边的权值置为
然后就是带权二分图匹配,跑(实数)最大费用最大流即可。
如果觉得太慢可以转成整数费用流,学习zkw
,或者学习更加有理有据的带权匹配算法。
评测记录(EK)
能够发现就是个带权匹配,没听说过2012年引入了一般图带权匹配,先有理有据地猜测这是个二分图。
建立出
然后跑个二分图带权匹配就是了,注意到
评测记录
仍然是二分图带权带容量匹配,只不过费用是分段函数。
观察数据限制发现,这个分段函数是凸的,那么直接给每一段建立一条边,一定会先走前面的边,就已经符合题意了。
求最小费用最大流即可,注意答案存储需要开long long
。 评测记录
如果没有保质期限制,非常简单。
对每一天建点,连源,容量为生产力,费用为(负的)成本; 连汇,容量为最大售出量,费用为单价。
每天连向下一天,费用为
但是本题有保质期限制,所以第
数据范围较小,可以直接转为费用匹配。
对每天分别建立出点入点。分别计算出从第
我们要求的不一定是最大流,而是最大费用任意流,所以当费用为负时直接退出即可。
评测记录
某辆车先修理这一决策,不仅仅会导致这辆车花费等待时间,还会影响到排在后面的车。
我们考虑提前计算贡献。对于某个技术人员,排名倒数第
这能够让我们简化状态 : 某辆车,在某个技术人员手中,排名倒数第几。对应的贡献就是确定的。
现在就变成了一个带费用的匹配问题,跑最小费用最大流即可。点数是
评测记录(久远)
和上一题是本质相同的,难点在于数据范围增大了,不能直接跑费用流。
容易发现,如果倒数第
EK
算法每次只会找到一条增广路,我们可以每次增广之后,查看新的匹配,然后把下一个空加入即可。
这样,总点数就是
图比较稠密,推荐使用vector
。评测记录
首先,容易把所有的限制转成某个位置的值
然后注意到值域不大,我们可以对每个位置的每种决策(匹配)分别建边。
每个点有
对于每个桶,代价并不是线性的。这也好办,类似上一题枚举代价差分即可,由于平方是凸函数,一定会先走前面的边。
求最小费用最大流即可。评测记录
本身就有
每场比赛设置一个点,流量限制为
求出某支球队总共需要比赛的场数
考虑多赢一场造成的花费变化量 :
不难发现这个值随着
对于某支球队,算出多赢一场所需的费用,然后一条条连边,表示多赢第……场。(注意已有的胜场)
由于费用递增,费用流一定会依次按照赢场递增走边,这是一定符合状态定义的。
注意到
评测记录
题意 : 给一个部分确定的竞赛图定向,要求三元环尽量多。
我们不妨最小化非三元环子图,然后用三点子图
考虑某三点子图不是三元环的情况(请自行画图) : 某个点入度为
来到整张图中考虑,能够发现某点若入度为
对于每条未定向的边,限制流量为
对于每个端点,连向汇。此时的费用不是线性的,由于
评测记录1 & 评测记录2
图的最小环覆盖?
先跑一个Folyd
。
按照套路把点拆成出入点,某两个点之间的匹配可以看做将两条路径接在一起。
进一步发现,对于一个完美匹配(置换?),按照匹配连接路径之后正好得到若干个环。
那么我们在这个二分图的
这样需要
但是每个点自己成环,代价(距离)不是
源连出点,入点连汇,从入到出免费不限流量,从出点到入点(反向)需要
评测记录
UVA12092 Paint the Roads
题意 :
让染色的边形成若干个回路,且每个点都恰好属于其中
上一题的扩展,直接令每个点的出入度都为
还需要限制每条边只能染一次,这就只能建立原图并拆点了。
评测记录 (数据似乎较弱……)
容易发现可能的父子关系是一个DAG
,这就不会出现环。
观察到二叉树的每个点都必选,这就没必要限制流的连续性。(也就躲过了“分流”的难题)
将每个点拆成出入点,入点连汇,容量为
源连出点,容量为
各个点之间连边,按照欧氏距离确定费用。
最后求解(实数)最小费用最大流。评测记录
奇怪的题目……要求费用为正?先考虑经典的费用流。
设
由于能匹配的对子
现在有要求费用为正的情况下流量尽量大,由于经典最大费用流算法中,每次按照最长路增广,最长路会逐渐变短。
这是具有单调性的,我们只需要使劲增广直到总费用为负数即可。注意最后一次增广可能只能获得一部分流量。
评测记录
注意有多组数据,不要像我一样白WA
两发。
注意到不同的方案中,关于相交的限制是不同的,多个可能的匹配之间的互斥关系十分复杂。
考虑先使用几何知识分析,若有两条相交的线段(灰色),将其调整成不相交的连接方式(黑色),长度一定会变短。
(可以使用三角形两边之和大于第三边证明)
所以,不难得到结论 : 对于一个交错的方案,必定存在一个不交错的方案,连线总长度更短。
由于题目保证有解,我们求解最小费用匹配就得到了答案。
评测记录
不难发现这是个DAG
,问题就是最小权路径覆盖。可以转为二分图带权匹配。
直接暴力建边,边数可能达到
观察到我们每次都在向一个编号前缀连边,而费用是绝对值,与
离散化之后主席树优化建边即可。具体来讲,需要维护两颗主席树,一棵点权为
连边时,向第一棵的
这样边数就降为了
[评测记录] ()
不难发现这张图每个点只有一个出度,就是一个基环内向树森林。若满足“循环”的定义,一定是由若干个环组成。
“环森林”的充要条件就是 : 每个点都只有一个入度,一个出度,这可以视作匹配。
首先拆成出入点,各有
对于一个点,可以向四个方向(注意边界循环)匹配,若恰好是自己的初始方向,费用为
然后就是二分图带权匹配了,由于费用小建议跑zkw
。 评测记录
非常有意思的题目。
不漏水的要求,相当于让相邻格子之间流量尽量大。
可以给棋盘染个色变成二分图,黑的位置连源,白的位置连汇,就能让相邻格子产生流。
考虑对这些形状分类讨论。设
由于每个点可能有四个接头,我们对每个位置建立
下面对于特定朝向的形状进行分析,只需要旋转就能得到所有情况。
中向上连一条
先让中向上右各连一条
考虑顺时针转一次,相当于上面少了一个接头,下面多了一个接头。上向下连
能够发现,旋转两次的情况,流量到了左下,费用恰好为
先让中向上左右各连一条
顺时针旋转一次,相当于左边少了一个接头,下面多了一个接头。左向下连
也可以转两次,相当于上面少了一个接头,下面多了一个接头。上向下连
发现直线不好建模,但是直线恰好不能转,直接让中向左右各连一条
十字形显然转了和没转一样,直接让中向上下左右各连一条
注意需要根据“中”连的是源还是汇,来确定边的方向。
别忘了在相邻的对应方格的对应接头之间连上
然后把讨论在代码里复现,求最小费用最大流。
由于费用很小,增广路较短,多路增广的zkw
比EK
快
第一问就是最大流。然后将源点的流量限制为
将每条边复制一份作为“扩容边”,容量为
评测记录(久远)
从第
从源连第
从第
求最小费用最大流即可。 评测记录
奇怪的是 DP
解法……建议加强到
很像朴素的匹配问题 : 每段只能匹配
我们向每个区间连边,问题来了,对于一段区间我们不好限制必须要整体选择。
一个关键的性质是 : 可以把最优解划分成选择若干次不交的区间集合的形式。能够发现选择
考虑每个区间拆成出入点,之间容量为
按左端点排序,每个区间向着后面不交的区间连边,容量为
注意到“不交”具有单调性,我们给每个区间入点到下一个入点之间新增一条边,容量为
这样就只需要向着后面第一个不交的区间连边了,边数降为
容易发现,一个流的意义就是选择一个不交的区间集合。
然后每个区间的入点都连源,容量为
求最大费用最大流即可。
评测记录1 & 评测记录2
和上一题就两个区别 : 长度的计算方式变了。有可能出现垂直于
我们将所有的位置
评测记录
神仙题.jpg
同样很像朴素的匹配问题,考虑对每天建立点限制流量,发现志愿者只能够向一个区间整体贡献,不好处理。
换一种方法建图,将每天串起来。
考虑只有一种志愿者怎么办,显然需要
而我们的网络流,串联边的规则是流量取
最终的目标就是让最大流达到
考虑志愿者能够提供怎样的帮助 : 给
我们就可以从
然后跑一个最小费用最大流即可。评测记录
有另一种更加循规蹈矩的方法,通过线性规划推式子转费用流。
设
不等式不便分析,考虑添加松弛变量变为等式,设
将第
考虑容斥,
如果我们把每个式子看做一个点,正数表示流入,负数表示流出,等式就代表着流量平衡。我们能得到如下的建图方法。
(类似上下界网络流)钦定每个点的流量总和为常数
观察到
观察到
然后就是最小费用最大(可行)流。由于未知的原因,比上一种方法明显低效。评测记录
神仙题.jpg
观察一本书的行为 : 若
“持有”这一状态不包含流量的改变,不好建模。不妨考虑叠缩,视作可以在昨天售出上次供给的同类书,并且总会再次购入。
这样就使得我们的策略一定合法。
将每一天拆成 : 售卖处
每天的顺序是: 先卖,再买,然后回收。
设第
不难发现,可以将
观察这个模型,若某本书当天没有被扔掉,一定会一直待在书架里占用位置,直到被卖掉。
求最小费用最大流。 评测记录
我们巧妙地在回收站包含了信息,而利用题目中的要求必须满足的性质将状态缩减,把不同的书当做同样的流量处理。
类似的题 : CF132E Bits of merry old England & [评测记录] ()
输出方案的话,记录下每个售出和购入,将能串的串在一起,然后按时间顺序扫描即可。
可能会用
用
考虑对每天分别拆点,流量限制为
然后跑有源汇上下界最大流即可。评测记录
观察“每条雪道至少被清理一次”的要求,相当于流量至少为 DAG
并将限制设为
接下来就是有源汇上下界最小流。
评测记录
第一问考虑DP
,注意到可能的路径并非DAG
,需要仔细考虑。
能够发现有每个
设
转移让前面的树贡献,每棵树只会有“上,右上,左上”三种转移方式。拿桶搞一搞就容易得出转移目标。
接下来是同行转移,我们可以非常暴力地枚举进入点和离开点
设一行的点数为
注意,对于每次转移,还需要记录最优方案。反向递归这些方案回答第二问。
我们按照转移顺序反向标记出那些点可能达到最优解,找出所有包含在最优转移中的“左上,右上,上”边,它们组成一个DAG
。
接下来就是上一题了,求有源汇上下界最小流即可。
[评测记录] ()
有源汇上下界最小费用可行流。
每条边至少被经过一次,流量限制就是
然后把有源汇上下界可行流套上费用流就做完了。(注意要计算初始流的费用)
评测记录
容易发现只是在P4043
的基础上把点的容量限制定死了。
评测记录
由于引力大小的限制,若只考虑高速航行,这图是个DAG
。
能够发现,空间跳跃的花费和起点无关,我们可以将方案等效抽象成以从起点跳跃开头的若干条路径。
于是就可以转化为和上面类似的DAG
遍历问题。
求最小费用可行流。 评测记录
由于限制点不相交,还能转化成最小代价路径覆盖。
首先让每个点自成一条路径,此时代价是
仿照最小路径覆盖,建立二分图,一条匹配边就代表将两条路径合在一起。
所以从
但此时我们求的并不是最小费用最大流,而是最小费用合法流。
由于费用流中最短路一定会逐渐变长,我们只需要增广直到最短路为正即可。
比起上一种方法,不需要上下界,代码更短,跑得也要略快一些。评测记录
去日本旅游的黑猫警长xswl
反正所有的据点最终一定会被干掉,多条路径之间,我们不需要关心相对顺序。
只需要限制每条单独的(摧毁)路径必须按顺序进行,最后把各个路径归并一下即可。
问题在于,目前占领了多少据点,可能影响到我们走的最短路。
先使用 Folyd
预处理出
如果一个人上一次摧毁
然后就是一个DAG
的最短
同样也可以使用费用匹配求解路径覆盖。这里
评测记录
直接建立矩阵对应的结构不好做,考虑从行“剥离”总和贡献到列。
给每行每列都建立一个点,有容量下界限制。
对于B
点,要求入流量(B
)严格大于出流量(R
),则连边
对于右半部:
对于R
点,要求入流量(R
)严格大于出流量(B
),则连边
对于B
点,要求出流量(B
)严格大于入流量(R
),则连边
对于U
点,总是无要求,则连边
然后求最小费用可行流,费用只有两种,多路增广会快。 评测记录
对于原图的边
若
反向流动 : 容量为 f--;
)
正向流动① : 容量为 f++;
)
正向流动② : 容量为 f++,c++;
)
若
能够发现至少有
反向流动① : 容量为 f≤c
之前的f--;
或c++;
)
反向流动② : 容量为 f≤c
之后的 f--;
)
正向流动 : 容量为 f++,c++;
)
对于原图中已有的流量,连边
求上下界最小费用可行流即可。
评测记录
不妨设
考虑给每行每列分别建立点,一个
绝对值的限制可以视作上下界,跑上下界最大流即可。
出题人有点猛,直接搞了
评测记录
任意行或列的部件数不能超过整个芯片总部件的
没有什么好的处理方法,也不存在单调性,只能考虑枚举芯片总部件数,这样能够确定行和列的限制。
现在转化成了若干个这种问题 : 限制每行每列最多
直接枚举需要
考虑我们枚举的芯片总部件给了这张图传了什么信息,不难发现就只有对于行的限制。
而行的容量最多
提交记录
还有一种不需要神仙模板的人类智慧做法。
注意到我们如果仅仅把放置当做流量,“能否放置”和“行列等量”很难兼顾。
不妨把放置和不放置都记作流量,然后给放置附上费用引导决策。
行列分别建点,形成二分图。源连行,列连汇,容量
第
对于可决策的区域
对于必须不放置的区域
接下来可以选择使用上下界,限定流量恰好为
另外一种神奇的做法是 : 容量为
如果满流,且所有
提交记录
随手一写居然两种做法都1A
了,有点感动。
UVA1659 帮助小罗拉 Help Little Laura
题意 : 给定一个平面上的一些有向线段,涂色费用为
环路的涂色费用为各边涂色费用和。找出一些环路,使得这些环路边不相交,且涂色费用总和最大。
最大费用循环流的模板题。直接求解最大费用无源汇可行流会遇到正环,可以使用和“负环费用流”类似的方法。
也即 : 把原图的
意思就是先把所有的正权边强制流满,然后建立反向边来退流。
接着就是上下界无源汇最小费用可行流,不难发现图中没有正环了。
这个题浮点数不开SPJ
,手动加1e-7
才能通过……
评测记录