Cod sursa(job #269163)

Utilizator gabor_oliviu1991gaboru corupt gabor_oliviu1991 Data 2 martie 2009 16:41:45
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<stdio.h>
#include<string.h>
#define N 1050

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 ,N);
	memset(coada, 0, N);
	memset(t, 0 , N);
	memset(d,0,N);

	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 = c[d[1]][d[2]];
			for(i = 2; i < k; i++)
				if(c[d[i]][d[i+1]] < min)
					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", flux);

	return 0;
}