网络流建模之 DAG 最小路径覆盖

· · 个人记录

路径不相交

模板题:P2764 最小路径覆盖问题

首先显然可以用 n 条路径覆盖,每条路径只覆盖一个点。

考虑每次合并两条路径,将起点为 y 的路径接到终点为 x 的路径后边,这样路径总数减一。

将每个点拆成两个点 a_i,b_i,连边 (S,a_i) (b_i,T),以下默认所有边流量为 1

因为 (S,a_i) (b_i,T) 的流量为 1,所以每个点只会被接到一个点后边,也只会把一个点接到后边。

若存在边 (x,y),则连边 (a_x,b_y),表示将起点为 y 的路径接到终点为 x 的路径后边。

因为建出的是二分图,且边权为 $1$,所以时间复杂度 $O(m\sqrt n)$。 不是 DAG 怎么做? 如果允许一条路径经过一个点多次,先缩点再用之前的做法。 否则可以直接用之前的做法。 习题: [P2765 魔术球问题](https://www.luogu.com.cn/problem/P2765) [P2172 [国家集训队]部落战争](https://www.luogu.com.cn/problem/P2172) [P2469 [SDOI2010]星际竞速](https://www.luogu.com.cn/problem/P2469) ## 路径可相交 做法 1 先对原图求传递闭包。传递闭包求法见 [bitset 应用总结](https://www.luogu.com.cn/blog/221955/bitset-ying-yong-zong-jie)。 新建一张图,若原图上 $x$ 能到达 $y$,且 $x\neq y$,则新图上连边 $(x,y)$。 对新图跑路径不相交的做法即可。 正确性是显然的。对于一个路径可相交的方案,从中每个点任取一次,其他的全部删掉,就转换成了新图上路径不相交的方案。新图上路径不相交的方案,对于边 $(x,y)$ 加入原图 $x$ 到 $y$ 路径上的所有点,就转换成了原图上路径可相交的方案。 例题:[P4298 [CTSC2008]祭祀](https://www.luogu.com.cn/problem/P4298) 根据 Dilworth 定理有最长反链等于最小链覆盖,于是第一问的答案就是路径可相交的最小路径覆盖。对于第二问,求出建出的二分图的最大独立集,也就是最小点覆盖的补集,做法见[二分图总结](https://www.luogu.com.cn/blog/221955/er-fen-tu-xiang-guan#),保留 $a_x,b_x$ 都出现在最大独立集中的点,即为所求。对于第三问,相当于枚举每个点 $x$,删掉 $x$ 以及 $x$ 能到达的所有点以及能到达 $x$ 的所有点,判断剩余部分的最小路径覆盖是否等于原图 $-1$。 习题:[P4589 [TJOI2018]智力竞赛](https://www.luogu.com.cn/problem/P4589) ## 路径可相交 做法 2 [#217. 【UNR #1】奇怪的线段树](https://uoj.ac/problem/217) 此题边数 $O(n)$,但传递闭包后边数变成 $O(n^2)$,二分图匹配复杂度是 $O(n^{2.5})$。 考虑用上下界网络流。连边 $(S,a_i),(b_i,T),(a_i,b_i)$,对于图中的边 $(i,j)$ 连 $(b_i,a_j)$。$(a_i,b_i)$ 下界为 $1$,其余边下界为 $0$,所有边上界为 $+\infty$,求有源汇上下界最小流即可。因为流量 $O(n)$ 只会进行 $O(n)$ 次 bfs,所以复杂度 $O(n^2)$。 还有一种更简便的建图,连边 $(S,a_i),(b_i,T)$ 流量为 $1$,连边 $(b_i,a_i),(a_i,b_j)$ 流量为 $+\infty$,$n$ 减去最大流即为答案。原因是对于一条 $S\to a_i\to\cdots\to b_j\to T$ 的流,相当于将原图上满足 $i$ 能到 $j$ 的点对 $(i,j)$ 匹配,于是就相当于传递闭包上二分图匹配。