Cod sursa(job #513385)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 15 decembrie 2010 20:04:17
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
// infoarena: problema/maxflow //
#include <fstream>
#include <queue>
#include <cstring>
#define MAXN 1010
using namespace std;

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

int f[MAXN][MAXN],c[MAXN][MAXN],i,j,n,m,a,b,s,d,t[MAXN],r,flux;

int bf()
{
	memset(t, 0, sizeof(t));
	queue<int> q;
	q.push(s);
	int nod;
	while(!q.empty())
	{
		nod = q.front(); q.pop();
		for(i=1; i<=n; i++)
			if(!t[i] && c[nod][i] > f[nod][i])
			{
				t[i] = nod, q.push(i);
				if(i == d)
					return 1;
			}
	}
	return 0;
}

int main()
{
	in>>n>>m;
	for(i=1; i<=m; i++)
		in>>a>>b>>c[a][b];
	
	s=1, d=n;
	
	for(flux=0; bf(); flux += r)
	{
		r = 1<<30;
		i = d;
		while(i!=s)
		{
			if(r > c[t[i]][i] - f[t[i]][i])
				r = c[t[i]][i] - f[t[i]][i];
			i = t[i];
		}
		i = d;
		while(i!=s)
		{
			f[t[i]][i] += r;
			f[i][t[i]] -= r;
			i = t[i];
		}
	}
	
	out<<flux;
	
	return 0;
}