Cod sursa(job #565373)

Utilizator cdascaluDascalu Cristian cdascalu Data 27 martie 2011 17:34:56
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 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];
		if(nod == D){++p;continue;}
		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;
			}
		++p;
	}
	return T[D];
}
int minim(int a,int b)
{
	if(a<=b)return a;
	return b;
}
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);
		G[y].push_back(x);
	}
	f.close();
	int flux = 0,r,nod;
	while(bf(1,N))
	{
		for(vector<int>::iterator it = G[N].begin();it!=G[N].end();++it)
		{
			T[N] = (*it);
			r = INF;
			nod = N;
			while(nod!=1)
			{
				r = minim(r, C[T[nod]][nod] - F[T[nod]][nod]);
				nod = T[nod];
			}
			nod = N;
			while(nod!=1)
			{
				F[T[nod]][nod] += r;
				F[nod][T[nod]] -= r;
				nod = T[nod];
			}
			flux+=r;
		}
	}
	ofstream g("maxflow.out");
	g<<flux<<"\n";
	g.close();
	return 0;
}