Cod sursa(job #254014)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 6 februarie 2009 15:21:24
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <string.h>

const int NMAX=1010;
const int MMAX=5010;
const long INF=100000000;

int cont[NMAX], q[NMAX], prec[NMAX], *a[NMAX], n;
long flux[NMAX][NMAX], c[NMAX][NMAX];
long long f;

void flux_max(int s, int d);
bool bf(int s, int d);

int main()
{
	int x[MMAX], y[MMAX], i, m; 
	long z;
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for (i=0; i<m; i++)
	{
		scanf("%d%d%ld", &x[i], &y[i], &z);
		cont[x[i]]++;
		cont[y[i]]++;
		c[x[i]][y[i]]=z;
	}//for i
	for (i=1; i<=n; i++)
	{
		a[i]=new int[cont[i]+1];
		a[i][0]=0;
	}//for i
	for (i=0; i<m; i++)
	{
		a[x[i]][++a[x[i]][0]]=y[i];
		a[y[i]][++a[y[i]][0]]=x[i];
	}//for i
	flux_max(1, n);
	printf("%lld\n", f);
	return 0;
}//main

void flux_max(int s, int d)
{
	long min;
	int i;
	while (bf(s, d))
	{
		min=INF;
		i=d;
		while (i!=s)
		{
			if ((c[prec[i]][i]-flux[prec[i]][i])<min)
				min=c[prec[i]][i]-flux[prec[i]][i];
			i=prec[i];
		}//while	
		i=d;
		while (i!=s)
		{
			flux[prec[i]][i]+=min;
			flux[i][prec[i]]-=min;
			i=prec[i];
		}//while
		f+=min;
	}//while
}//flux_max

bool bf(int s, int d)
{
	int u=0, p=0, t, i, j;
	memset(prec, -1, sizeof(prec));
	q[u]=s;
	prec[s]=-2;
	while (p<=u)
	{
		t=q[p++];
		for (i=1; i<=a[t][0]; i++)
		{
			j=a[t][i];
			if ((prec[j]==-1)&&(c[t][j]>flux[t][j]))
			{
				q[++u]=j;
				prec[j]=t;
				if (j==d)
					return 1;
			}//if
		}//for i
	}//while
	return 0;	
}//bf