来源:《算法竞赛入门经典(第二版)》P368
#include<vector>
#include<queue>
#include<string.h>
#define INF 0x3f3f3f3f
#define MAXN 1000
using namespace std;
struct Edge{
int from, to, cap, flow;
Edge(int u, int v, int c, int f): from(u), to(v), cap(c), flow(f){}
};
struct EdmondsKarp{
int n, m;
vector<Edge> edges;
vector<int> G[MAXN];//邻接表,G[i][j]表示结点i的第j条边在e数组中的序号
int a[MAXN];//当起点到i的可改进量
int p[MAXN]; //最短路树上p的入弧编号
void init(int n){
for(int i=0;i<n;i++){
G[i].clear();
}
edges.clear();
}
void AddEdge(int from, int to, int cap){//from:起点编号,to:终点编号,cap:容量
edges.push_back(Edge(from, to, cap, 0));
edges.push_back(Edge(to, from, 0, 0));//反向弧
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1) ;
}
int Maxflow(int s, int t){//s:源点编号,t:汇点编号,返回最大流
int flow=0;
for(;;){
memset(a, 0, sizeof(a));
queue<int> Q;
Q.push(s);
a[s]=INF;
while(!Q.empty()){
int x=Q.front();
Q.pop();
for(int i=0;i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(!a[e.to] && e.cap>e.flow){
p[e.to]=G[x][i];
a[e.to]=min(a[x], e.cap-e.flow);
Q.push(e.to);
}
}
if(a[t])break;
}
if(!a[t])break;
for(int u=t;u!=s;u=edges[p[u]].from){
edges[p[u]].flow+=a[t];
edges[p[u]^1].flow-=a[t];
}
flow+=a[t];
}
return flow;
}
};