Cod sursa(job #457693)

Utilizator coderninuHasna Robert coderninu Data 20 mai 2010 22:29:59
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <cstdio>
#include <string>
#include <vector>

using namespace std;

#define Nmax 1001

vector< int > G[Nmax];
int C[Nmax][Nmax], F[Nmax][Nmax];
int q[Nmax], viz[Nmax];
int N, M, x, y, z, i, j, P, U, flow, fmin, S, D;

int BF()
{
	memset(viz,0,sizeof(viz));
	q[0] = 1; P = U = 0;
	viz[1] = 1;
	while (P <= U)
	{
		x = q[P++];
		for (vector< int > :: iterator it = G[x].begin(); it != G[x].end(); ++it)
			if (C[x][*it] > F[x][*it] && !viz[*it])
			{
				q[++U] = *it;
				viz[*it] = x;
			}
	}
	return viz[N];
}

inline int min(int x, int y) { return x < y ? x : y; }

int flux()
{
	flow = 0;
	while (BF())
	{
		for (vector< int > :: iterator it = G[N].begin(); it != G[N].end(); ++it)
			if (C[*it][N] > F[*it][N])
			{
				fmin = C[*it][N] - F[*it][N];
				for (x = *it; x != 1; x = viz[x])
					fmin = min(fmin, C[viz[x]][x] - F[viz[x]][x]);
				for (x = *it; x != 1; x = viz[x])
				{
					F[viz[x]][x] += fmin;
					F[x][viz[x]] -= fmin;
				}
				flow += fmin;
				F[*it][N] += fmin;
				F[N][*it] -= fmin;
			}
	}
	return flow;
}



int main()
{
	freopen("maxflow.in", "r", stdin);
	
	for ( scanf("%d %d\n", &N, &M); M; --M )
	{
		scanf("%d %d %d\n", &x, &y, &z);
		C[x][y] = z;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	

	fprintf(fopen("maxflow.out", "w"), "%d", flux());
	return 0;
}