Cod sursa(job #403884)

Utilizator laserbeamBalan Catalin laserbeam Data 25 februarie 2010 15:13:00
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
// Catalin Balan
// Thu Feb 25 14:41:41 EET 2010
// Infoarena - Flux Maxim

#include <cstdio>
#include <cstdlib>
#include <list>
#include <cstring>

using namespace std;

#define	NMAX 1004
#define CHUNK 8192
#define INF 0x3f3f3f3f
#define min(a,b) (a<b?a:b)

#define FIN "maxflow.in"
#define FOUT "maxflow.out"

char g_buf[CHUNK];
int g_p=CHUNK-1;

inline int get(FILE *f)
{

	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
	{
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
	}
	return x;
}

int Cap[NMAX][NMAX];
int Flux[NMAX][NMAX];
int Q[NMAX];
list<int> G[NMAX];
int n;
int viz[NMAX];
int parent[NMAX];

int BF()
{
	Q[1] = 1;
	int len = 1, now, next;
	memset(viz,0,sizeof(viz));
	for (int i = 1; i <= len; ++i)
	{
		now = Q[i];
		if (now == n) continue;
		for (list<int>::iterator it = G[now].begin(); it != G[now].end(); ++it)
		{
			next = *it;
			if (viz[next] || ( Cap[now][next] == Flux[now][next] )) continue;
			viz[next]		= 1;
			Q[++len] 	= next;
			parent[next]	= now;
		}
	}
	return viz[n];
}

int main(int argv, char ** argc)
{
	FILE *fin = fopen(FIN, "r");
	FILE *fout = fopen(FOUT, "w");

	n = get(fin);
	int m = get(fin);
	int x,y;
	for (;m;--m)
	{
		x = get(fin); 
		y = get(fin);
		
		Cap[x][y] = get(fin);
		G[x].push_back(y);
		G[y].push_back(x);
	}

	int flow, minflow;
	for (flow = 0; BF();)
	{
		for (list<int>::iterator it = G[n].begin(); it != G[n].end(); ++it)
		{
			if (!viz[*it]) continue;
			parent[n] = *it;
			
			minflow = INF;
			for (int i = n; i != 1; i = parent[i])
				minflow = min(minflow, Cap[ parent[i] ][ i ] - Flux[ parent[i] ][ i ]);

			for (int i = n; i != 1; i = parent[i])
				Flux[ parent[i] ][ i ] += minflow, Flux[ i ][ parent[i] ] -= minflow;

			flow += minflow;
		}
	}

	fprintf(fout,"%d\n",flow);
	
	fclose(fin);
	fclose(fout);
	return EXIT_SUCCESS;
}