Cod sursa(job #279863)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 13 martie 2009 01:13:59
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<stdio.h>
#include<string.h>
#define N 1005
#define INF 110000
#define minim(x,y) ((x)<(y)?(x):(y))

int c[N][N], flux, d[N], k, cost, n, m;

void citire()
{
	freopen("maxflow.in","r",stdin);
	int i, x, y;
	scanf("%d %d", &n, &m);
	for( i = 1; i <= m; i++)
	{
		scanf("%d %d %d ", &x, &y, &cost);
		c[x][y] += cost;
	}
}

void schimb(int &zicu,int &pele)
{
	int lobont = zicu;
	zicu = pele;
	pele = lobont;
}

void bf()
{
	int viz[N], coada[N], t[N], i, j, p, u, nod_cur;

	memset(viz, 0 ,sizeof(viz));
	memset(coada, 0, sizeof(coada));
	memset(t, 0 , sizeof(t));
	memset(d, 0 , sizeof(d));

	p = u = 1;
	coada[p] = 1;
	viz[1] = 1;
	k = 0;
	while(p <= u)
	{
		nod_cur = coada[p];
		for(i = 1; i <= n; i++)
			if(viz[i] != 1 && c[nod_cur][i] > 0)
			{
				coada[++u] = i;
				viz[i] = 1;
				t[i] = nod_cur;
				if(i == n)
				{
					d[++k] = n;
					int x = n;
					while(t[x] != 0)
					{
						d[++k] = t[x];
						x = t[x];
					}
					for(j = 1; j <= k/2; j++)
						schimb(d[j], d[k-j+1]);
				return;
				}
			}
		p++;
	}
}

void FordFulkerson()
{
	int i, min;

	do
	{
		bf();
		if(k>0)
		{
			min = INF;
			for(i = 1; i < k; i++)
				min = minim(min,c[d[i]][d[i+1]]);

			flux +=min;
			for(i = 1; i < k; i++)
			{
				c[d[i]][d[i+1]] -=min;
				c[d[i+1]][d[i]] +=min;
			}
		}
	}
	while(k != 0);

}

int main()
{
	freopen("maxflow.out","w",stdout);

	citire();
	FordFulkerson();

	printf("%d\n", flux);

	return 0;
}