P4843 清理雪道:最小路径覆盖问题的变种
有两种方法:
-
最大费用流。
把网络流作为贪心的工具。
建图:原图中的点也当作新图中的点。对于一条原图的边,新图中建两条:一条容量 \(1\) 费用 \(1\),一条容量 \(+\infty\) 费用 \(0\)。(深海机器人的方法)\(s\) 向所有入度 \(0\) 的点(还有出度 \(0\) 向 \(t\))连容量 \(+\infty\) 费用 \(0\) 的边。
跑最大费用流。这样就视作每一条边第一次走的时候会贡献 \(1\),以后不再贡献。在跑最大费用流的时候,如果发现增广完当前费用等于原图中的边数,则退出增广,答案为当前增广的轮数。
为什么正确?有没有可能走了反边,增广次数比答案多?
不可能。因为如果有反边,一定是费用 \(-1\),但是我们有容量 \(+\infty\) 费用 \(0\) 的边。
-
有源汇上下界网络流。
建图:\((s,i,0,+\infty),(i,t,0,+\infty),(u,v,1,+\infty)\)。
-
二分图。(这个复杂度慢了,但是正确)
跑 Floyd 传递闭包,建出 \(G\) 的闭包 \(G'\)(若 \(u\) 在 \(G\) 中可达 \(v\),\(G'\) 中有边 \((u,v)\))
然后在 \(G'\) 上跑最小路径覆盖。