Cod sursa(job #672502)

Utilizator darkseekerBoaca Cosmin darkseeker Data 2 februarie 2012 12:34:25
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <vector>
using namespace std;

#define NMAX 1007
#define in "maxflow.in"
#define out "maxflow.out"
#define inf 100000000

ifstream fin(in);
ofstream fout(out);

int F[NMAX][NMAX],C[NMAX][NMAX],t[NMAX],viz[NMAX],q[NMAX];
int g[NMAX][NMAX];
int N,M,cnt = 0;

int bf(int nod)
{
	cnt++;
	int v,i,s,f,solved = 0;
	viz[nod] = cnt;
	q[1] = nod;
	t[1] = 0;
	s = f = 1;
	while(s <= f)
	{
		nod = q[s++];
		for(i  = 1 ; i <= g[nod][0]; i++)
		{
			v = g[nod][i];
			if(C[nod][v] > F[nod][v]  && viz[v] != cnt)
			{
				viz[v] = cnt;
				q[++f] = v;
				t[v] = nod;
				if(v == N)
					return 1;
			}	
		}
	}		
	return 0;
}

int main()
{
	fin>>N>>M;
	int i,x,y,flow,fmin,nod,z;
	
	for(i = 1; i <= M; i++)
	{
		fin>>x>>y>>z;
		C[x][y] = z;
		g[x][++g[x][0]] = y;
		g[y][++g[y][0]] = x;
	}
	
	for(flow = 0; bf(1) == 1; flow += fmin)
	{
		fmin = inf;
		for(nod = N; nod != 1; nod = t[nod])
			fmin = min(fmin,C[t[nod]][nod] - F[t[nod]][nod]);
		for(nod = N; nod != 1; nod = t[nod])
			F[t[nod]][nod] += fmin, F[nod][t[nod]] -= fmin;
	}
	
	fout<<flow<<'\n';
	
	fin.close();
	fout.close();
	
	return 0;
}