最大流 最小割问题
- 问题定义:有向图中,某一点流向另外一点的最大流量,有向边的权值表示通过这条边的最大流量
- 最大流问题其实属于一种优化问题,类似的如最短路径也是属于一种优化问题
具体可参考
最后得出的推论–也是解决本问题的方法
我的总结:将有向边的流量大小理解为节点之间的路径个数(平行边),最大流问题,即为找出起点与终点之间路径的个数。
方法,BFS/DFS + 构造反向图,直到得到最小S-T割(即不存在从S割到T割的有向边)
C++语言实现
/*
* 最大流 <--> 最小割
* maximum flow minimum cut
*/
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
void back_reverse(int target, int* prev, int* adjacency_matrix, int N){
// 从终点target开始倒序
int cur = target;
while(*(prev+cur) != -1){
int tmp = cur;
// 更新cur
cur = *(prev+cur);
// 添加反向边
++(*(adjacency_matrix+tmp*N+cur)