当一个图中的每条边都拥有流量和最大流量时,我们一般就会求整个图的最大流量,这种问题就是网络流的最大流问题。
一开始我们考虑使用贪心,遍历一条路,找到整条路上的最大流量的最小值,储存,然后更新各点,当某边流量值等于最大流量值时,删除该边,再次遍历知道没有从源点到汇点的路径。
但经过简单的验证我们发现,以上的贪心算法算出的结果不一定是最优解。
原因是什么?
原因就是贪心过早地“填满了一条边”,从而“封锁了流量继续增加的可能”。
所以我们思考,能否将“不合理”的边删掉,从而继续搜索路径。但实际上,直接进行删除操作太过复杂,所以我们可以将原边的逆向边加在图中,这样就可以巧妙地删除不合理的边,从而求到最优解。
int dfs(int to,int t,int f)
{
if(to==t)return f;
vis[to]=1;
for(int i=first[to];i!=0;i=next[i]){
int v=go[i];
if(vis[v]==0&&data[i]>0){
int d=dfs(v,t,min(f,data[i]));
if(d>0){
data[i]-=d;
data[i^1]+=d;
return d;
}
}
}
return 0;
}
该方法使用的是纯DFS<