首页 > 其他分享 >从《老鼠进洞》开始,浅谈模拟费用流

从《老鼠进洞》开始,浅谈模拟费用流

时间:2023-12-31 22:02:44浏览次数:24  
标签:老鼠 匹配 浅谈 费用 进洞 反悔 代价 模拟

部分内容来自 WC 2018 PPT。另外,我真的是浅谈。

前置知识

在学习一下的内容之前,你需要至少学会费用流相关概念,反悔贪心相关概念和堆。

当然了,你还要有足够学会模拟费用流的 OI 基础,因为本文会略去一部分比较 trivial 的道理。

老鼠进洞(其一)

有 \(n\) 个老鼠 \(n\) 个洞,每只老鼠向左走到任意一个洞里,最小化所有老鼠的移动距离和。

其实直接贪心即可。

另一方面,这个问题等价于有洞的权值 \(y_i\),老鼠的权值 \(x_i\),求最小权匹配。这本质上可以费用流,但是如果数据范围很大就不太好办了。因此考虑费用流是怎么跑的。

因为费用流的本质是反悔贪心,所以我们决定从这个角度出发来研究模拟费用流。从左向右依次扫洞和老鼠,不断进行匹配,为了让后边的老鼠可以反悔,我们设 \(f[i][j]\) 为前 \(i\) 个节点中有 \(j\) 个洞匹配了 \(i\) 之后的老鼠的最小权。那么这个 \(dp\) 很好通过栈优化,略去这一部分。

老鼠进洞(其二)

有 \(n\) 个老鼠 \(n\) 个洞,每只老鼠走到任意一个洞里,最小化所有老鼠的移动距离和。

显然,我们可以仿照老鼠进洞(其一)的方法解决。但是这个问题的复杂之处在于存在 \(j<0\) 的情况。在老鼠进洞(其一)中,我们采用了一个栈来优化转移。而在老鼠进洞(其二)中,我们则需要两个栈分别维护 \(j\le0\) 和 \(j>0\) 两种情况。

此称为栈模拟费用流。

当然我们也可以直接进入正题,说一个堆优化反悔贪心的有趣解法。

首先,我们不管三七二十一的一顿乱匹配(也就是不考虑其正确性),然后不断扫描来更新答案。

我们要维护目前尚未匹配的老鼠,目前尚未匹配的洞,所有老鼠反悔操作的代价和所有洞反悔的代价。在我们从左向右扫描所有的洞和老鼠的时候,我们会遇见以下的情况:

  • 扫描到了一只老鼠。
    • 此时,我们选取一个目前尚未匹配的洞(如果有的话)并将其匹配,如果没有的话,将其和无穷远点匹配,代表尚未匹配。
    • 然后,我们寻找所有洞反悔操作的代价最小值,如果代价加上收益大于目前这只老鼠的收益,将洞从堆顶取出,将洞和老鼠匹配,把新的代价放在堆中。本质上,这是洞在反悔,因为出现了新的老鼠。
    • 不管如何,我们把这只老鼠匹配到的洞记下来,再记一下它的反悔代价,扔在老鼠的堆里。
  • 扫描到了一个洞。
    • 这时,我们选取一个目前尚未匹配的老鼠(如果有的话)并将其匹配。如果没有的话,与无穷远点匹配,代表尚未匹配。
    • 然后,我们寻找所有老鼠反悔代价的最小值,如果代价加上收益大于目前这只老鼠的收益,将老鼠从堆顶取出,将洞和老鼠匹配,把新的代价放在堆中。本质上,这是老鼠在反悔,因为出现了新的洞。
    • 不管如何,我们把这个洞匹配到的老鼠记下来,再记一下它的反悔代价,扔在洞的堆里。

老鼠进洞(其三)

有 \(n\) 个老鼠 \(n\) 个洞,每只老鼠向左走到任意一个洞里,洞有代价。最小化所有老鼠的移动距离和与代价加和的和。

Sol 1:发现了一个凸函数,可以 wqs 二分了

Sol 2:不难发现,其二的费用流方法可以扩展。因为老鼠不可能反悔选择更右侧的洞,所以我们直接去掉老鼠反悔这一环节。另一方面,我们只需要稍稍改一下反悔代价,这个做法可以轻松过掉老鼠进洞(其三)。

老鼠进洞(其四)

有 \(n\) 个老鼠 \(n\) 个洞,每只老鼠走到任意一个洞里,洞有容量。最小化所有老鼠的移动距离。

Sol 1:有一个特别牛的 Lemma 是,如果定向老鼠必须全部向左/向右走,所得到的答案对应洞的权值加和,与原容量取 \(\min\) 之后的结果,其容量必定不小于某组最优解所用掉的对应的洞的容量。容易证明这个东西最后用掉的容量和应该是 \(O(n)\) 的,因此就转化成了老鼠进洞(其二)。

Sol 2:其实就是其二加上了容量。何足为惧?在其二的模拟费用流算法中,多记一个目前的容量,此题也被秒掉了。

嗯就先写到这里。事实上,我认为老鼠进洞(其二)的费用流解法虽然大材小用,但十分实用,是很值得学习的方法。

前面的区域,以后再来探索吧!

标签:老鼠,匹配,浅谈,费用,进洞,反悔,代价,模拟
From: https://www.cnblogs.com/Piggy424008/p/17938089/brain-is-xxxxed-up

相关文章

  • 2023.12.31模拟赛总结
    前言:这次还行,今年的最后一场比赛,300pts,rank4T1赛时摆烂了,没有牢记“正难则反”,打了暴力,还挂了正解从后往前考虑,考虑在这个点对后面的点的影响,发现就是p乘上了一个系数,直接从后往前算的时候乘上即可,最后再考虑初始的wT2发现取权值连续的一段数一定是最优的,随便维护一下即可T3......
  • Python调用 "keybd_event" API模拟按键
    在Python中,可以使用ctypes库来调用WindowsAPI,实现对Windows系统的底层操作。本文将以模拟按键操作(ctrl+v)为例,详细讲解如何在Python中调用WindowsAPI。1.导入ctypes库ctypes是Python的一个外部函数库,它提供了丰富的数据类型,便于调用DLL或共享库中的函数。......
  • C++U3-第07课-模拟枚举
    学习目标 枚举算法意思示例枚举重点[【模拟枚举】水仙花数]  【题意分析】我们需要找出区间内所有的水仙花数【思路分析】用for循环的方式去判断从100到999的每一个数将当前的数个位、十位、百位求出判断每一位的数的次方之和是否等于本身【参考代码】......
  • 2023.12.30模拟赛总结
    前言:这次比赛打的不是很好,100pts,rank8T1赛时想到了正解,但是因为一些题面的原因和代码细节没调出来首先可以写出暴力dp:\(f[i][j]\)表示到第i位,选了i且选了j个哨岗的最大范围枚举k为上一个,直接暴力转移是\(O(n^3)\)的,过不去然后,我们发现可以分类讨论,如果\([l_i,r_i]\)和\([l_k......
  • 12.30模拟赛
    依然倒一,虽然比上次完全不会强一些了,但是挂了一堆分……T1奇怪地挂掉了,但是也反映了代码能力还是不行,求个子树内最大最小都要错,而且还把问题复杂化了。就是先并查集找根,记录子树内最值然后看子树大小等不等于极差就完事儿了,没那么多别的。点击查看代码#include<bits/stdc++.h......
  • 浅谈网络流
    浅谈网络流最近网络流做了一堆,感觉有微弱的进步!记录一些好的套路,好的错误,以便以后再错板子根据地方法律法规,最大流中\(Dinic\)以及费用流中\(EK\)不应当被卡,望周知下面并没有出现\(HLPP\)的任何板子因为这个东西十分的难调并理论时间复杂度很对(一定不是指上界......
  • 6 浅谈XILINX FIFO的基本使用
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述首先来大概了解下什么是FIFO,FIFO(FirstInputFirstOutput)简单说就是指先进先出。FIFO也是缓存机......
  • 27 浅谈XILINX BRAM的基本使用
    软件版本:VIVADO2021.1操作系统:WIN1064bit硬件平台:适用XILINXA7/K7/Z7/ZU/KU系列FPGA登录米联客(MiLianKe)FPGA社区-www.uisrc.com观看免费视频课程、在线答疑解惑!1概述对于BRAM详细的说明在XILINX官方文档,pg058中有说明,我们这里仅对课程涉及的内容讲解。Xlinx系列FPGA......
  • 浅谈10kV站所柜内运行状态及环境指标监测管理平台分析
    安科瑞张田田摘要:在整个电能管理系统中,配电室综合监控占据着重要的位置。现阶段,配电室通常均运用无人值守、定时巡查制度,此方式不仅需要投入诸多的物力与人力,同时也不能实时监控配电室的安全与环境。而配电室环境的可靠性与稳定性直接影响着变压器等设备的正常运行。对此,主要对10kV......
  • 浅谈居民小区配电房动力环境监控系统研究与应用
    安科瑞张田田摘要:智配电站动力环境监控系统通过构建三级监控网络,基于TCP/IP网络协议作为通讯构架,组建IP网络与监控中心进行传输。实现对配电站房的远程监控管理。同时采用了集中式管理模式,快速实现区域内配电站房的有效覆盖,为用户提供配电站所的配变电压、电流、有功功率、无功......