void augment_path(graph *g, int start, int end, int parents[], int volume) { if (start == end) return; edgenode *e = find_edge(g, parents[end], end); e->flow += volume; e->residual -= volume; e = find_edge(g, end, parents[end]); e->residual += volume; augment_path(g, start, parents[end], parents, volume); }
void netflow(graph *g, int source, int sink) { add_residual_edges(g); initialize_search(g); bfs(g, source); int volume = path_volume(g, source, sink, parent); while (volume > 0) { augment_path(g, source, sink, parent, volume); initialize_search(g); bfs(g, source); volume = path_volume(g, source, sink, parent); } }
int max_flow(int src, int dest){ int flow=0,i,dist[MAX]; memset(parent,-1,sizeof(parent)); while (1){ f = 0; memset(parent,-1,sizeof(parent)); memset(queue,0,sizeof(queue)); ind = 0; for (i=0;i <= n; ++i) dist[i] = INT_MAX; push(src); dist[src] = 0; while ( !empty() ){ int u = front(); pop(); if (u == dest) break; for (i=1;i<=n;++i){ if ( g[u][i] > 0 && dist[i] == INT_MAX ){ dist[i] = dist[u] + 1 ; push(i); parent[i] = u; } } } augment_path(dest,INT_MAX); if (f == 0) break; flow += f; } return flow; }