Cod sursa(job #564552)

Utilizator cdascaluDascalu Cristian cdascalu Data 27 martie 2011 10:43:18
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<string.h>
#include<vector>
#include<fstream>
#define INF 0x3f3f3f
#define MAX 1001
using namespace std;
int C[MAX][MAX],F[MAX][MAX],T[MAX],N,M;
vector<int> G[MAX];
int bf(int S,int D)
{
	int p,u,Q[MAX],nod;
	p = u = 1;
	memset(T, 0, sizeof(T));
	Q[p] = S;
	T[S] = -1;
	vector<int>::iterator it;
	while(p<=u)
	{
		nod = Q[p];
		for(it = G[nod].begin();it!=G[nod].end();++it)
			if(!T[(*it)] && C[nod][(*it)] > F[nod][(*it)])
			{
				Q[++u] = (*it);
				T[(*it)] = nod;
				if((*it) == D)return 1;
			}
		++p;
	}
	return 0;
}
int minim(int a,int b)
{
	if(a<=b)return a;
	return b;
}
int FLUX()
{
	int flux,r,i;
	for(flux = r = 0;bf(1,N);flux+=r)
	{
		r = INF;
		i = N;
		while(i!=1)
		{
			r = minim(r, C[T[i]][i] - F[T[i]][i]);
			i = T[i];
		}
		i = N;
		while(i!=1)
		{
			F[T[i]][i] += r;
			F[i][T[i]] -= r;
			i = T[i];
		}
	}
	return flux;
}
int main()
{
	ifstream f("maxflow.in");
	f>>N>>M;
	int i,x,y,c;
	for(i=1;i<=M;++i)
	{
		f>>x>>y>>c;
		C[x][y] = c;
		G[x].push_back(y);
	}
	f.close();
	ofstream g("maxflow.out");
	g<<FLUX()<<"\n";
	g.close();
	return 0;
}