Cod sursa(job #400658)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 21 februarie 2010 19:10:45
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 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; 
	memset(T,0,sizeof(T));
	T[1]=-1;
	
	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[fiu] && C[nod][fiu] > F[nod][fiu])
			{
				Q[++u]=fiu;
				T[fiu]=nod;
				if(fiu==n) return 1;
			}
		}
	}
	return 0;
}

/*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];
		
		for(i=1;i<=n;i++)
		{
			if(!T[i] && C[nod][i] > F[nod][i])
			{
				Q[++u]=i;
				T[i]=nod;
				if(i==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;
}