Cod sursa(job #238270)

Utilizator pauldbPaul-Dan Baltescu pauldb Data 1 ianuarie 2009 16:27:12
Problema Flux maxim Scor Ascuns
Compilator cpp Status done
Runda Marime 1.42 kb
#include <stdio.h>
#include <assert.h>
#include <vector>

using namespace std;

#define maxn 1010
#define inf 200000

int N, M;
int Drum, L;
vector <int> A[maxn];
int G[maxn];
int S[maxn], U[maxn], From[maxn];
int C[maxn][maxn];

int BFS()
{
	int i, j;

	Drum = 0;
	memset(U, 0, sizeof(U));
	memset(From, -1, sizeof(From));

	L = 1;
	S[L] = 1;
	U[1] = 1;

	for (i = 1; i <= L && !Drum; i++)
		for (j=0; j<G[S[i]]; j++)
			if (C[S[i]][A[S[i]][j]]>0 && !U[A[S[i]][j]])
			{
				S[++L] = A[S[i]][j];
				From[S[L]] = S[i];
				U[S[L]] = 1;

				if (S[L] == N)
				{
					Drum = 1;
					break;
				}
			}

	if (Drum)
	{
		int Vmin = inf;

		for (i = N; i != 1; i = From[i]) Vmin = min(Vmin, C[From[i]][i]);
	
		for (i = N; i != 1; i = From[i]) 
		{
			C[From[i]][i] -= Vmin;
			C[i][From[i]] += Vmin;
		}

		return Vmin;
	}
	
	return 0;
}

int Flux()
{
	int rez = 0;

	Drum = 1;

	while (Drum) rez += BFS();

	return rez;
}

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

	int x, y, z, i;

	scanf("%d %d ", &N, &M);

	assert(1 <= N && N <= 1000);
	assert(1 <= M && M <= 5000);

	for (i = 1; i <= M; i++)
	{
		scanf("%d %d %d ", &x, &y, &z);

		assert(1 <= x && x <= N);
		assert(1 <= y && y <= N);
		assert(1 <= z <= 110000);

		assert(x != N);
		assert(y != 1);

		C[x][y] += z;

		A[x].push_back(y);
		A[y].push_back(x);
	}

	for (i = 1; i <= N; i++) G[i] = A[i].size();

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

	return 0;
}