直接上代码:
/** 每次直接用BFS 找最短增广路,时间复杂度为O(VE²) */
int maxflow(int s, int t, int n)
{
queue<int>q;
memset(flow,0,sizeof(flow));
int f = 0;
while(1) {
memset(a,0,sizeof(a));
a[s] = INF;
q.push(s); //BFS 找增广路
while(!q.empty()) {
int u = q.front(); q.pop();
for(int v=1; v<=n; v++)
if(!a[v] && cap[u][v]>flow[u][v])
{ //找到新结点V
a[v] = min(a[u],cap[u][v] - flow[u][v]);
pre[v] = u; //记录V的父亲,并加入到FIFO队列
q.push(v);
}
}
if(a[t] == 0) break; //找不到,当前流已经是最大流
for(int u=t; u!=s; u=pre[u]) {//从汇点往回走
flow[pre[u]][u] += a[t]; //正向更新流量
flow[u][pre[u]] -= a[t]; //反向更新流量
}
f += a[t]; //更新从s流出的总流量
}
return f;
}