Cod sursa(job #250753)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 31 ianuarie 2009 19:01:21
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 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]+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("%ld", flux_max(1, n));
	return 0;
}//main

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

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