Cod sursa(job #254024)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 6 februarie 2009 15:42:36
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 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

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

void flux_max(int s, int d)
{
	long min;
	int i, j, nod;
	while (bf(s, d))
		for (j=1; j<=a[d][0]; j++)
			if ((prec[a[d][j]]!=-1)&&(flux[a[d][j]][d]<c[a[d][j]][d]))
			{
				nod=a[d][j];
				prec[d]=nod;
				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;
			}//if
}//flux_max