最小割的方案

最小割的方案

By SemiWaker

一头雾水


可在最小割上的边

做完网络流后,求残量网络 SCC。
设点 x 所在 SCC 编号为 SCC[x]。
对于满流边 ( u,v ),若 SCC[u]SCC[v],则边 ( u,v ) 可以在最小割上。

原因: 将 SCC 缩点,那么新图的任意最小割都是原图的最小割,其中肯定有把 SCC[u] 和 SCC[v] 割开的最小割。


最小割的必须边

求残量网络 SCC。
对于满流边 ( u,v ) ,若 SCC[u]=SCC[S] 而且 SCC[v]==SCC[T] ,那么边 ( u,v ) 必须。

原因: 如果一条边是必须的,那么增加这条边的容量一定会改变最大流。
残量网络的 SCC 缩点后构成一个 DAG ,其中 T 必然能到达 S ,总体方向是从 T 往 S 的方向连边。
当且仅当 ( u,v ) 刚好在 SCC[S] 和 SCC[T] 之间时,增加 ( u,v ) 的流量才能增大最大流。


最小割任意方案

每次选取一条满流边 ( u,v ) ,用一次 DFS 判断是否能在残量网络上,从 v 到达 u ,且不经过 ( u,v ) 的反向边。
如果不可以,那么 ( u,v ) 不在最小割集上,跳过。
如果可以,输出 ( u,v ) 。
当然,直接求SCC也是可以的,但是下一步需要O(n)的时间,所以这一步优化意义不大

选了 ( u,v ) 之后,可能某些满流边再选就不是最小割了。
所以要消除 ( u,v ) 的影响。

考虑强行退流 ( u,v ) 。
完全退流 ( u,v ) 相当于跑了一次 EK,不优。
但是我们不需要完全退流,只需要退流 1 即可。

退流 1 的方法是:从 T 开始 DFS 到 v ,找一条路流 1 。
然后从 u 开始 DFS 到 S , 找一条路径流 1 。
然后把 ( u,v ) 及其反向边删掉。(即容量设为 0)

这样就改变了原图的连通性,让不能再选的边不再满流或者不在最小割集上。


最小字典序最小割方案

同上,从编号小的边开始枚举。


最少割边的最小割方案

做完一次最小割后,令所有满流边容量为 1,非满流边容量为 ∞ 。

再做一次最小割,此时的任意最小割方案割边都最少。


最少割边字典序最小最小割方案

总和以上,先做一次最小割,按照最少割边的方式处理后再做一次,再跑最小字典序的最小割方案。


By SemiWaker

发布了13 篇原创文章 · 获赞 29 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览