Cod sursa(job #1172192)

Utilizator roxana.istratePoenaru Roxana roxana.istrate Data 16 aprilie 2014 23:02:25
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <string.h>

#define max 1001
#define infinity 1000000

using namespace std;
/* muchiile din graf */
vector < vector <int> > graph;
/* capacitatile muchiilor */
int C[max][max];
/* fluxul actual pe muchie */
int F[max][max];
/* vector de parinti 
 * folosit la bfs pt actualizarea capacitatilor reziduale */
int parents[max];

vector < pair < int, int> > results;

int path[max];
int N, M;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

vector < pair < int, int> >  bfs(int source, int target){
	
	/* clear parents vector */
	memset(parents, -1, sizeof(parents));
	/* clear current path */
	memset(path, 0, sizeof(path));
	
	results.clear();
	
	queue<int> q;
	parents[source] = -2;
	path[source] = infinity;
	q.push(source);
	while(!q.empty()){
		int elem = q.front();
		q.pop();
		for(int i = 0; i < graph[elem].size(); i++){
			int u = graph[elem][i];
			if(C[elem][u] - F[elem][u] > 0 && parents[u] == -1){
				path[u] = min(path[elem], C[elem][u] - F[elem][u]);
				if(u == target) {
					results.push_back(make_pair(elem, path[u]));
				}else{
					parents[u] = elem;
					q.push(u);
				}
			}
		}
	}
	return results;
}

int edmonds_karp(int source, int target){
	int max_flow = 0, back;
	vector < pair < int, int> > rezid;
	while(true){
		rezid = bfs(source, target);
		if(rezid.size() == 0) break;
		//cout << rezid.size() << "\n";
		for(int i = 0; i < rezid.size(); i++){
			back = target;
			parents[back] = rezid[i].first;
			while(source != back){
				F[parents[back]][back] += rezid[i].second;
				F[back][parents[back]] -= rezid[i].second;
				back = parents[back];
			}
			max_flow += rezid[i].second;
		}
	}
	return max_flow;
}

int main(){
	int a, b, c;
	vector<int> v;
	fin >> N >> M;
	for(int i = 0; i < N; i++) 
		graph.push_back(v);
	for(int i = 0; i < M; i++){
		fin >> a >> b >> c;
		graph[--a].push_back(--b);
		graph[b].push_back(a);
		C[a][b] = c;
	}
	
	int max_flow = edmonds_karp(0,N-1);
	fout << max_flow << "\n";
	return 0;
}