Cod sursa(job #269581)

Utilizator coderninuHasna Robert coderninu Data 3 martie 2009 01:09:39
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <vector>
#include <deque>


#define Nmax 1001
#define inf 0x3f3f3f37

using namespace std;

vector < int > g[Nmax];
deque < int > Q;
int N, M, i, x, y, c, flow, fmin; 
int C[Nmax][Nmax], F[Nmax][Nmax], viz[Nmax];
fstream fin("maxflow.in", ios::in), fout("maxflow.out", ios::out);

int bf()
{
	memset(viz,0,sizeof(viz));
	for ( Q.clear(), Q.push_back(1), viz[1]=-1; !Q.empty(); Q.pop_front() )
	{
		x = Q.front();
		for (i = 0; i<g[x].size(); ++i)
		{
			y = g[x][i];
			if (C[x][y] == F[x][y] || viz[y]) continue;
			viz[y] = x;
			Q.push_back(y);
			if (y == N) return 1;
		}
	}
	return 0;
}

inline int min(int x, int y) { return x < y ? x : y; }

int main()
{
	for ( fin >> N >> M; M; --M )
	{
		fin >> x >> y >> c;
		g[x].push_back(y);
		g[y].push_back(x);
		C[x][y] += c;
	}
	
	for (; bf(); flow+=fmin)
	{
		for ( fmin = inf, x = N; viz[x] != -1; x = viz[x] )
			fmin = min(fmin, C[ viz[x] ][x] - F[ viz[x] ][x]);
		for (x = N; viz[x] != -1; x = viz[x])
		{
			F[viz[x]][x] += fmin;
			F[x][viz[x]] -= fmin;
		}
	}
	fout << flow;
	return 0;
}