P4843 清理雪道:最小路径覆盖问题的变种

有两种方法:

  1. 最大费用流。

    把网络流作为贪心的工具。

    建图:原图中的点也当作新图中的点。对于一条原图的边,新图中建两条:一条容量 \(1\) 费用 \(1\),一条容量 \(+\infty\) 费用 \(0\)。(深海机器人的方法)\(s\) 向所有入度 \(0\) 的点(还有出度 \(0\)\(t\))连容量 \(+\infty\) 费用 \(0\) 的边。

    跑最大费用流。这样就视作每一条边第一次走的时候会贡献 \(1\),以后不再贡献。在跑最大费用流的时候,如果发现增广完当前费用等于原图中的边数,则退出增广,答案为当前增广的轮数。

    为什么正确?有没有可能走了反边,增广次数比答案多?

    不可能。因为如果有反边,一定是费用 \(-1\),但是我们有容量 \(+\infty\) 费用 \(0\) 的边。

  2. 有源汇上下界网络流。

    建图:\((s,i,0,+\infty),(i,t,0,+\infty),(u,v,1,+\infty)\)

  3. 二分图。(这个复杂度慢了,但是正确)

    跑 Floyd 传递闭包,建出 \(G\) 的闭包 \(G'\)(若 \(u\)\(G\) 中可达 \(v\)\(G'\) 中有边 \((u,v)\)

    然后在 \(G'\) 上跑最小路径覆盖

posted @ 2024-02-28 08:36  FLY_lai  阅读(4)  评论(0编辑  收藏  举报