Cod sursa(job #269585)

Utilizator coderninuHasna Robert coderninu Data 3 martie 2009 01:24:12
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <vector>


#define Nmax 1001
#define inf 0x3f3f3f37

using namespace std;

struct graf {int nod; graf * next;} *g[Nmax];
int N, M, i, x, y, c, flow, fmin; 
int C[Nmax][Nmax], F[Nmax][Nmax], viz[Nmax], Q[Nmax];

int bf()
{
	memset(viz,0,sizeof(viz));
	for ( Q[0] = Q[1] = 1, viz[1]=-1, i = 1; i <= Q[0]; ++i )
	{
		x = Q[i];
		for (graf * p = g[x]; p; p = p -> next)
		{
			y = p->nod;
			if (C[x][y] == F[x][y] || viz[y]) continue;
			viz[y] = x;
			Q[++Q[0]] = y;
			if (y == N) return 1;
		}
	}
	return 0;
}

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

int main()
{
	freopen("maxflow.in", "r", stdin); freopen("maxflow.out", "w", stdout);
	for ( scanf("%d %d\n", &N, &M); M; --M )
	{
		scanf("%d %d %d\n", &x, &y, &c);
		graf *q = new graf; q->nod = y; q->next = g[x]; g[x] = q;
		q = new graf; q->nod = x; q->next = g[y]; g[y] = q;
		C[x][y] += c;
	}
	
	for (; bf(); flow+=fmin)
	{
		for ( fmin = inf, x = N; x != 1; x = viz[x] )
			fmin = min(fmin, C[ viz[x] ][x] - F[ viz[x] ][x]);
		for (x = N; x != 1; x = viz[x])
		{
			F[viz[x]][x] += fmin;
			F[x][viz[x]] -= fmin;
		}
	}
	printf("%d", flow);
	return 0;
}