转整数流
实数流转整数流
给定一个网络流,如果其存在一组可行流,使得每条边上的流量都是非负实数,且源点和汇点的净流量均为整数,那么总能找到这个网络流的另一组可行流,使得每条边的流量都是整数,并且每条边的新流量一定是原流量的上取整或下取整(若原本就是整数,则保持不变)。
下面我们来证明这个结论。
先把每条有向边暂时忽略方向,视为一条无向边。接着把所有已经是整数的边删掉,只保留那些当前流量不是整数的边。由于原流满足流量守恒,而源点和汇点的净流量都是整数,所以在剩下的图里,不可能出现「某个点恰好只连着一条非整数边」的情况;否则这个点的流量平衡无法由整数部分补偿回来。
因此,删完以后如果图中还剩边,那么剩下的每个连通块里都一定含有一个环。取出任意一个这样的环,并给它随便指定一个方向。
接下来考虑环上的每一条边。若某条边在原图中的方向与环方向一致,那么我们希望把它的流量向下调整;若方向相反,则希望把它的流量向上调整。更具体地说,定义这条边的「可调整量」为:
- 若边方向与环方向一致,则为
f_e-\lfloor f_e\rfloor ; - 若边方向与环方向相反,则为
\lceil f_e\rceil-f_e 。
在环上取这些可调整量的最小值,记为
- 对于方向一致的边,令流量减去
v ; - 对于方向相反的边,令流量加上
v 。
这样做有两个好处。首先,由于我们在同一个环上做同幅度调整,所以环上每个点的流量守恒不会被破坏;其次,
每次操作至少消去一条非整数边,因此这个过程一定会在有限步后结束,最终所有边都被调整成整数。这样,我们就构造出了所需的整数可行流,命题得证。
我们可以使用 LCT 维护这个过程。
维护一个森林,一条一条加入边,如果形成了一个环,则将这个环进行调整。时间复杂度
分数流转整数流
现在考虑一个更特殊的情形:设存在一个常数
答案是可以的。
a=3
先看
沿着一个环做一次调整时,每条边的变化只有两种:要么加
更具体地说,欧拉回路找环时,每次遍历到一个已经访问过的点,就把栈中对应的一段弹出,这样就能在
a=5
当
设
现在在图中找到一个环,并沿着环的方向做一次调整。对于环上的一条边,调整只有两种可能:如果它的方向和环方向一致,就让流量加
看单条边的贡献变化,可以发现:
- 从
\frac15 到\frac25 ,势能增加1 ;从\frac15 直接变成整数,则势能减少2 ; - 从
\frac25 到\frac35 ,势能不变;从\frac25 变成\frac15 ,势能减少1 ; - 从
\frac35 到\frac45 ,势能减少1 ;从\frac35 变成\frac25 ,势能不变; - 从
\frac45 到整数,势能减少2 ;从\frac45 到\frac35 ,势能增加1 。
也就是说,对任意一条边,把「加
于是总复杂度依旧是
一般的 a
让我们尝试找到一个通用的构造。
设
其中:
此时
也就是对于任意一个状态
构造
于是,如果一个环有
初始时,势能最多是
例题
- AGC018F Two Trees
- P16948 「LAOI-18」Two Tree Triples
AI 辅助了本文创作。
感谢 Cybher、the___、山田リョウ。