Cod sursa(job #250735)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 31 ianuarie 2009 18:05:45
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <string.h>
long a[1010][1010], b[1010][1010];
int prec[1010], *vecini[1010], n, m;

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

int main()
{
	int t1[5010], t2[5010], i, cont[1010];
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	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("%ld", &a[t1[i]][t2[i]]);
	}//for i
	for (i=1; i<=n; i++)
	{
		vecini[i]=new int[cont[i]+1];
		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("%ld", flux_max(1, n));
	return 0;
}//main

long flux_max(int s, int d)
{
	long f=0, min;
	int i;
	while (bf(s, d))
	{
		min=1000000000;
		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;
	memset(prec, -1, sizeof(prec));
	coada[0]=s;
	prec[s]=-2;
	p=0;
	u=0;
	while (p<=u)
	{
		t=coada[p++];
		for (i=1; i<=vecini[t][0]; i++)
			if ((prec[vecini[t][i]]==-1)&&((a[t][vecini[t][i]]-b[t][vecini[t][i]])>0))
			{
				coada[++u]=vecini[t][i];
				prec[vecini[t][i]]=t;
				if (coada[u]==d)
					return 1;
			}//if
	}//while
	return 0;
}//bf

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