コード例 #1
0
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);
}
コード例 #2
0
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);
    }
}
コード例 #3
0
ファイル: main.c プロジェクト: jfrbr/grafos
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;
}