最小割边数:
求法一:
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。
这道题困扰过我一段时间,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
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