O ( V*E*E )
对流增加的全部次数上界为O(VE),每次迭代时间O(E)
反向弧的本质就是代替之前的路线走完它剩下的路,并改变它的路径
int map[n][n], pre[n], flow[n]; // flow标记从源点到这里还剩多少流量可用
queue<int> q;
int bfs(int src,int dec){
while(!q.empty()) q.pop();
memset(pre,-1,sizeof(pre));
pre[src]=0;
flow[src]=INF;
初始化
q.push(src);
while(!q.empty()){
int p=q.front();
q.pop();
if(p==dec) break; // 找到了增广路径
for(int i=1;i<=n;i++){
if(map[p][i]&&pre[i]==-1){
pre[i]=p;
flow[i]=min(map[p][i],flow[p]);
q.push(i);
}
}
}
if(pre[dec]==-1)return -1;
return flow[dec];
}
int maxFlow(int src,int dec){
int increase,sum=0;
while((increase=bfs(src,dec))!=-1){
sum+=increase;
int k=dec;
while(k!=src){
map[pre[k]][k]-=increase;
map[k][pre[k]]+=increase; // 增加反向弧
k=pre[k];
}
}
return sum;
}