zoukankan      html  css  js  c++  java
  • 【模拟费用流·进阶篇】继兔子和洞而论的模拟费用流进阶模型

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

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

    唔姆,就到此为止了么?

  • 相关阅读:
    爬取卡通图片
    python 列表生成式
    python 装饰器
    python 协程 and 进程
    ssh登录缓慢问题
    解决 input 元素点击有蓝色边框的问题
    JavaScript面试题总结系列(九)
    JavaScript面试题总结系列(八)
    JavaScript面试题总结系列(七)
    JavaScript面试题总结系列(六)
  • 原文地址:https://www.cnblogs.com/Nero-Claudius/p/Simulation_of_CostFlow2.html
Copyright © 2011-2022 走看看