建图方法
将有上下界的网络流图转化成普通的网络流图
首先建立附加源点ss和附加汇点tt
对于原图中的边x->y,若限制为[b,c],那么连边x->y,流量为c-b
对于原图中的某一个点i,记d(i)为流入这个点的所有边的下界和减去流出这个点的所有边的下界和
若d(i)>0,那么连边ss->i,流量为d(i)
若d(i)<0,那么连边i->tt,流量为-d(i)
(以上与无源汇可行流相同)
在原图中添加一条边t->s,流量限制为[0,inf]
即让源点和汇点也满足流量平衡条件
这样就改造成了无源汇的网络流图
(以上与有源汇可行流相同)
在新图上跑ss到tt的最大流
若新图满流,那么一定存在一种可行流
记此时∑f(s,i)=sum1 ,即此时t->s的最大流,也就是s->t的反向边流量
将t->s这条边拆掉,在新图上跑s到t的最大流
记此时∑f(s,i)=sum2 ,即maxflow(s,t)
最终答案即为sum1+sum2
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
struct edge{
int to,cap,rev;
bool tag;
};