【模拟费用流·进阶篇】继兔子和洞而论的模拟费用流进阶模型

(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),最终给答案加上洞数( imes INF)即可。

进阶模型(2):上树

  • 一棵树上有一些兔子和一些洞,兔子所在节点编号为(x_i),洞所在节点编号为(y_i)
  • 每只兔子可以任意走,所花代价等于行走距离(树上距离)。
  • 每个洞有一个权值(v_i),表示进入这个洞所需的代价。
  • 每只兔子一定要进洞,每个洞最多进一只兔子。
  • 求最小代价。

其实依旧是按照原先的套路,考虑定下某一种方向来做。

由于它是树,我们可以直接从下往上做,每次合并信息并上传。

数轴版本要用堆维护,此时树上版本要合并信息,自然就是左偏树(可并堆)哒!

具体实现要考虑诸多细节。

(Postscript)

原本以为会是很长一篇博客,结果由于这些进阶模型都建立在常规模型基础之上,并没有特别大的改动,所以实在没什么可说的。

唔姆,就到此为止了么?

原文地址:https://www.cnblogs.com/Nero-Claudius/p/Simulation_of_CostFlow2.html