Cod sursa(job #292599)

Utilizator znakeuJurba Andrei znakeu Data 31 martie 2009 12:11:23
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>

const int MAXN = 1024;
const int MAXK = 2147483647;

struct borcan
{	int a,b;	};

int C[MAXN][MAXN];
int F[MAXN][MAXN];

int *V[MAXN];
borcan A[10*MAXN];
int No[MAXN];

int vizit[MAXN];
int chestie[MAXN],ce;
int chestiE[MAXN];

int N,M;

inline int MIN(int a, int b)
{ if (a>b) return b; return a;}

inline void sosete()
{
	int i,X,Y,Z;
	
	scanf("%d%d",&N,&M);
	
	for (i=0; i<M; ++i)
	{
		scanf("%d%d%d",&X,&Y,&Z);
		C[X][Y]+=Z;
		A[2*i].a=X; A[2*i].b=Y;	No[X]++;
		A[2*i+1].a=Y; A[2*i+1].b=X; No[Y]++;
		
	}
	
	for (i=1; i<=N; ++i)
	{	V[i]=new int [ No[i] +2 ]; V[i][0]=0; }

	for (i=0,Z=2*M; i<Z; ++i)
		V[ A[i].a ][ ++V[A[i].a][0] ]=A[i].b;
}

inline int ciuperca()
{
	int i,j;
	
	chestie[0]=1; ce=1; vizit[1]=1;
	for (i=2; i<=N; ++i)vizit[i]=0;
	
	for (i=0; i<ce; ++i)
		if (chestie[i]!=N)
			for (j=1; j<=V[ chestie[i] ][0]; ++j)
				if (F[chestie[i]][ V[ chestie[i] ][j] ]!=C[chestie[i]][ V[ chestie[i] ][j] ]  && vizit[ V[ chestie[i] ][j] ]==0)
				{
					vizit[ V[ chestie[i] ][j] ] = 1;
					chestie[ ce++ ] = V[ chestie[i] ][j];
					chestiE[ V[ chestie[i] ][j] ] = chestie[i];
				}	
	return vizit[N];
}


inline void bocanci()
{
	int munte=0,vale,j,i;
	
	while (ciuperca())
		for (j=1; j<= V[N][0]; ++j)
			if ( F[ V[N][j] ][N]!=C[ V[N][j] ][N] && vizit[ V[N][j] ])
			{
				chestiE[N] = V[N][j]; vale=MAXK;
				
				for (i=N; i!=1; i=chestiE[i])
					vale=MIN(vale,C[ chestiE[i] ][i] - F[chestiE[i]][i]);
				
				if (vale)
					for (i=N; i!=1; i=chestiE[i])
					{	
						F[chestiE[i]][i]+=vale;
						F[i][chestiE[i]]-=vale;						
					}
				
				munte+=vale;				
			}	
	
	printf("%d\n",munte);
}

int main()
{
	freopen("maxflow.in" ,"r",stdin );
	freopen("maxflow.out","w",stdout);
	
	sosete();
	bocanci();
	
	fclose(stdin );
	fclose(stdout);
	return 0;
}