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

\(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\)

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

唔姆,就到此为止了么?

posted @ 2020-08-18 21:05  童女讴歌的荣华帝政  阅读(408)  评论(0编辑  收藏  举报