【模拟费用流·进阶篇】继兔子和洞而论的模拟费用流进阶模型
\(Preface\)
唔姆,余又来啦!
本文将继续兔子和洞的问题,聊一聊模拟费用流基于常规模型产生的两种进阶模型。
前置知识
进阶模型\(1\):分身(【UOJ455】【UER #8】雪灾与外卖)
- 一条数轴上有一些兔子和一些洞,兔子的坐标为\(x_i\),洞的坐标为\(y_i\)。
- 每个位置上的兔子和洞都有一个数量(\(10^9\)级别)。
- 每只兔子可以往左右两边走,所花代价等于行走距离。
- 每个洞有一个权值\(v_i\),表示进入这个洞所需的代价。
- 每只兔子一定要进洞,每个洞最多进一只兔子。
- 求最小代价。
分身的情况其实非常简单啦。
首先考虑暴力,直接把一个位置上的兔子和洞拆成一个一个,显然会炸飞。
实际上,只要把一个位置上的洞用pair
绑起来,然后同样按照常规模型的做法去做即可。
复杂度是可以证明的,因为产生的新兔子和新洞数量应该是常数级别的,证明大概需要借助一些奇怪的姿势,这里就省略了。
进阶模型\(1.5\):分身·\(Alter\)
- 一条数轴上有一些兔子和一些洞,兔子的坐标为\(x_i\),洞的坐标为\(y_i\)。
- 每个位置上的兔子和洞都有一个数量(\(10^9\)级别),且每个位置上的洞必须匹配至少一个。
- 每只兔子可以往左右两边走,所花代价等于行走距离。
- 每个洞有一个权值\(v_i\),表示进入这个洞所需的代价。
- 每只兔子一定要进洞,每个洞最多进一只兔子。
- 求最小代价。
假设一个位置上有\(c_i\)个洞,则把它拆开,变成\(1\)个必须匹配的洞和\(c_i-1\)个一般的洞。
考虑如何让一个洞一定会匹配,实际上只要给它的权值减去\(INF\),最终给答案加上洞数\(\times INF\)即可。
进阶模型\(2\):上树
- 一棵树上有一些兔子和一些洞,兔子所在节点编号为\(x_i\),洞所在节点编号为\(y_i\)。
- 每只兔子可以任意走,所花代价等于行走距离(树上距离)。
- 每个洞有一个权值\(v_i\),表示进入这个洞所需的代价。
- 每只兔子一定要进洞,每个洞最多进一只兔子。
- 求最小代价。
其实依旧是按照原先的套路,考虑定下某一种方向来做。
由于它是树,我们可以直接从下往上做,每次合并信息并上传。
数轴版本要用堆维护,此时树上版本要合并信息,自然就是左偏树(可并堆)哒!
具体实现要考虑诸多细节。
\(Postscript\)
原本以为会是很长一篇博客,结果由于这些进阶模型都建立在常规模型基础之上,并没有特别大的改动,所以实在没什么可说的。
唔姆,就到此为止了么?