Cod sursa(job #1007272)

Utilizator otilia_sOtilia Stretcu otilia_s Data 8 octombrie 2013 18:10:48
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>

using namespace std;

const int INF = 0x3f3f3f3f;
const int NMAX = 1003;
vector<int> G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int viz[NMAX], N, src, dest;

void read_data() 
{
	ifstream fin("maxflow.in");
	int M;
	fin >> N >> M;
	for (int i = 0; i < M; ++i) {
		int x, y, c;
		fin >> x >> y >> c;
		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y] = c;
	}
}

int BFS() 
{
	memset(viz, 0, sizeof(viz));
	viz[src] = src;
	
	queue<int> Q;
	Q.push(src);
	
	while (!Q.empty()) {
		int x = Q.front();
		Q.pop();
		if (x == dest)
			continue;
		
		for (vector<int>::iterator it = G[x].begin(); it!=G[x].end(); ++it) 
			if (!viz[*it] && C[x][*it] - F[x][*it] > 0) {
				viz[*it] = x;
				Q.push(*it);
			}
	}
	return viz[dest];
}

int maxflow()
{
	src = 1;
	dest  = N;
	int flow = 0;
	while(BFS()) {
		for (vector<int>::iterator it = G[dest].begin(); it!=G[dest].end(); ++it) {
			if (viz[*it] && C[*it][dest] - F[*it][dest] > 0) {
				viz[dest] = *it;
				
				int fmin = INF;
				for (int x = dest; x != src; x = viz[x]) 
					fmin = min(fmin, C[viz[x]][x] - F[viz[x]][x]);
				
				if (fmin) 
					for (int x = dest; x != src; x = viz[x]) {
						F[viz[x]][x] += fmin;
						F[x][viz[x]] -= fmin;
					}
				flow += fmin;
			}
		}			
	}
	return flow;
}

int main()
{
	read_data();
	ofstream fout("maxflow.out");
	fout<<maxflow();
	return 0; 
}