Cod sursa(job #400626)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 21 februarie 2010 18:26:43
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#include<vector>
#define Nmax 1010
#define INF 1<<30
#define Min(a,b) a<b ? a : b
using namespace std;

int C[Nmax][Nmax],F[Nmax][Nmax],T[Nmax],flux,i,n,m,r,a,b,c,Q[Nmax];
vector <int> V[Nmax];

int bfs()
{
	int nod,u=1,p,i,N,fiu;
	Q[1]=1; T[1]=-1;
	memset(T,0,sizeof(T));
	
	for(p=1;p<=u;p++)
	{
		nod=Q[p];
		N=V[nod].size();
		
		for(i=0;i<N;i++)
		{
			fiu=V[nod][i];
			if(!T[i] && C[nod][fiu] > F[nod][fiu])
			{
				Q[++u]=fiu;
				T[fiu]=nod;
				if(fiu==n) return 1;
			}
		}
	}
	return 0;
}

int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&a,&b,&c);
		V[a].push_back(b);
		//V[b].push_back(a);
		C[a][b]=c;
	}
	
	for(flux=0; bfs(); flux+=r)
	{
		r=INF;
		
		for(i=n; i!=1; i=T[i])
			r=Min(r, C[T[i]][i]-F[T[i]][i]);
		
		for(i=n; i!=1; i=T[i])
		{
			F[T[i]][i]+=r;
			F[i][T[i]]-=r;
		}
	}

	printf("%d",flux);
	return 0;
}