Cod sursa(job #250927)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 1 februarie 2009 12:23:16
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <string.h>

const int NMAX=1010;
const int MMAX=5010;
const int INF=1<<30;

int a[NMAX][NMAX], b[NMAX][NMAX], prec[NMAX], *vecini[NMAX], n, m;

int flux_max(int s, int d);
bool bf(int s, int d);
int minim(int a, int b);

int main()
{
	int t1[MMAX], t2[MMAX], i, cont[NMAX];
	int z;
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	scanf("%d%d",&n,&m);
	for(int i=0; i<m; i++)
	{
		scanf("%d%d%d",&t1[i],&t2[i],&z);
		++cont[t1[i]];
		++cont[t2[i]];
		a[t1[i]][t2[i]]=z;
	}//for i
	for(int i=1; i<=n; i++)
	{
		vecini[i]=new int[cont[i]+2];
		vecini[i][0]=0;
	}//for i
	for(int i=0; i<m; i++)
	{
		vecini[t1[i]][++vecini[t1[i]][0]]=t2[i];
		vecini[t2[i]][++vecini[t2[i]][0]]=t1[i];
  }//for i
/*	scanf("%d%d", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d%d", &t1[i], &t2[i]);
		cont[t1[i]]++;
		cont[t2[i]]++;
		scanf("%d", &a[t1[i]][t2[i]]);
	}//for i
	for (i=1; i<=n; i++)
	{
		vecini[i]=new int[cont[i]+2];
		vecini[i][0]=0;
	}//for i
	for (i=1; i<=m; i++)
	{
		vecini[t1[i]][++vecini[t1[i]][0]]=t2[i];
		vecini[t2[i]][++vecini[t2[i]][0]]=t1[i];		
	}//for i*/
	printf("%d", flux_max(1, n));
	return 0;
}//main

int flux_max(int s, int d)
{
	int f=0, min;
	int i;
	while (bf(s, d))
	{
		min=INF;
		i=d;
		while (i!=s)
		{
			min=minim(min, a[prec[i]][i]-b[prec[i]][i]);
			i=prec[i];
		}//while 
		i=d;
		while (i!=s)
		{
			b[prec[i]][i]+=min;
			b[i][prec[i]]-=min;
			i=prec[i];
		}//while
		f+=min;
	}//while
	return f;
}//flux_max

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

int minim(int a, int b)
{
	if (a<b)
		return a;
	else
		return b;
}//minim