网络流-最小割边数和最小割边集求法

最小割边数:

 

求法一:

1.求出原网络的最大流.

2.把可能的关键割边(即满流的边)容量置为 1,其余边容量置为 0.

3.求出修改后网络的最大流.

 

此时的最大流即是最小割时最少的割边数。

总共求了 2 次最大流。

 

更好的求法二:

以下用 E 表示网络流中的边数.

1.建图时,把每条边的边权 w 置为 w * (E + 1) + 1.

2.求出修改后网络的最大流 flow_max.

 

此时原图的最大流为 flow_max / (E + 1) ,最少的割边数为 flow_max mod (E + 1). (E + 1 也可以换作一个大于等于它的任意数)

总共只求了 1 次最大流。


最小割边集:

在执行过 SAP 的残量网络上寻找满流的边(满流的边才可能是关键割边),即残量为 0 的边 。从原图,原图,原图中删去这条边,即将正向边残量置为 0,并执行一次 SAP 得到最大流。如果原最大流与此时得到最大流的差正好为该边容量,且此时得到的最小割边数正好比原最小割边数少 1 (求法见上文),则将该边加入最小割边集。重复这个过程,直到残量网络上所有满流边被讨论完毕。

 

【USACO4.4.2】Pollutant Control追查坏牛奶 就是一道考察这两个知识点的题目, NKOJ1852。

这道题困扰过我一段时间,代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const long long int MAXN = 55000;
 7 const long long int MAXM = 50005;
 8 const long long int INF = ~0ull >> 1;
 9 
10 long 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值