Cod sursa(job #241319)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 9 ianuarie 2009 20:08:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
using namespace std;

#include <vector>
#include <bitset>

#define pb push_back
#define sz size
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define CC(v) memset((v),0,sizeof((v)))

#define IN  "maxflow.in"
#define OUT "maxflow.out"
#define N_MAX 1<<10

int rez,N,M;
int T[N_MAX],C[N_MAX][N_MAX];
vector< vector<int> > A(N_MAX);
bool viz[N_MAX];

void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	scanf("%d%d",&N,&M);
	
	int x,y,cc;
	FOR(i,1,M)
	{
		scanf("%d%d%d\n",&x,&y,&cc);
		A[x].pb(y);
		A[y].pb(x);
		C[x][y] = cc;
	}	
}

void BF()
{
	CC(viz);
	CC(T);
	viz[1] = true;
	vector<int> Q;
	Q.pb(1);
	
	
	for(int i=0;i<(int)Q.sz();++i)
	{
		int nod = Q[i];
		int l = A[nod].sz()-1;
		FOR(j,0,l)
		{
			int fiu = A[nod][j];
			if(!viz[fiu] && C[nod][fiu]) 
			{
				T[fiu] = nod;
				viz[fiu] = true;
				Q.pb(fiu);
			}	
		}
	}
}

bool flux()
{
	int flux(0);
	if(!T[N])
		return false;
	FOR(i,1,N-1)
	{
		if(!C[i][N] || !viz[i])
			continue;
		int aux(C[i][N]);
			
		for(int nod = i;T[nod];aux = min(aux,C[T[nod]][nod]),nod = T[nod]);
		if(!aux)
			continue;
		C[i][N] -= aux;
		C[N][i] += aux;
		for(int nod = i;T[nod];C[T[nod]][nod] -= aux,C[nod][T[nod]] += aux,nod = T[nod]);

		flux += aux;
	}	
	rez += flux;	
	return true;	
}

void solve()
{
	for(BF();flux();BF());
	printf("%d\n",rez);
}

int main()
{
	scan();
	solve();
	return 0;
}