#define MAX_NUMBER 10000
#define INF 1000
int cap[MAX_NUMBER][MAX_NUMBER]; /*边的容量*/
int flow[MAX_NUMBER][MAX_NUMBER]; /*边的流量*/
int father[MAX_NUMBER]; /*记录每一个点的前趋顶点*/
int queue[MAX_NUMBER];
int vis[MAX_NUMBER];
int edmondsKarp(int source, int destination) {
int max_flow = 0;
int front, rear;
int current_point, i, last_point;
memset(flow, 0, sizeof(flow));
while (1) {
memset(vis, 0, sizeof(vis));
front = 0;
rear = 1;
queue[front] = source;
vis[source] = INF;
while (front < rear) { /*采用bfs来寻找增广路*/
current_point = queue[front];
for (i = 1; i <= point_number; i++) {
if (!vis[i] && cap[current_point][i] > flow[current_point][i]) {
father[i] = current_point;
queue[rear] = i;
if (cap[current_point][i] - flow[current_point][i] < vis[current_point]) {
vis[i] = cap[current_point] - flow[current_point][i];
}
else {
vis[i] = vis[current_point];
}
}
}
front++;
}
if (vis[destination] == 0) { /*没有寻找到增广路*/
break;
}
for (last_point = destination; last_point != source; last_point = father[last_point]) { /*更新流量*/
flow[father[last_point]][last_point] += vis[destination]; /*更新正向流量*/
flow[last_point][father[last_point]] -= vis[destination]; /*更新反向流量*/
}
}
}