直接上代碼:
/** 每次直接用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;
}