Cod sursa(job #300859)

Utilizator laserbeamBalan Catalin laserbeam Data 7 aprilie 2009 18:55:02
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include<cstdio>
#include<cstring>
#include<vector>
#define NMAX 1001
#define UNLIMITED 0x3f3f3f3f
using namespace std;
char buf[64],*p;
int get()
{
	int t = 0;
	for (; *p>='0' && *p<='9';++p)
		t = t*10+ *p-'0';
	for (; *p == ' '; ++p);
	return t;
}

int parent[NMAX],viz[NMAX],coada[NMAX],FFlow[NMAX][NMAX],N,M,capac[NMAX][NMAX];
vector<int> Graf[NMAX];

inline int minim(int a, int b)
{return (a<b)?a:b;}

int BF()
{
	int current, j, varf;
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	coada[1]=1;
	for (int p=1,u=1;p<=u; ++p)
	{
		current = coada[p];
		for (j = 0; j < Graf[current].size(); ++j)
		{
			varf = Graf[current][j];
			if (capac[current][varf] == FFlow[current][varf] || viz[varf])continue;
			viz[varf] = 1;
			parent[varf] = current;
			coada[++u] = varf;
			if (varf == N) return 1;
		}
	}
	return 0;
}

int getflow()
{
	int i,Fmin,Cflow;
	for (Cflow = 0; BF(); Cflow += Fmin)
	{
		Fmin = UNLIMITED;
		for (i = N; i != 1; i = parent[i])
			Fmin = minim(Fmin, capac[parent[i]][i] - FFlow[parent[i]][i]);
		for (i = N; i != 1; i = parent[i])
			FFlow[parent[i]][i] +=Fmin;
			FFlow[i][parent[i]] -=Fmin;
	}
	return Cflow;
	
}

int main()
{
	int x,y,i;
	FILE *f = fopen("maxflow.in","r");
	fscanf(f,"%d %d\n",&N,&M);
	for (i = 1; i <= M; ++i)
	{
		fgets(buf,sizeof(buf),f);p=buf;
		x = get();
		y = get();
		capac[x][y] = get();
		Graf[x].push_back(y);
		Graf[y].push_back(x);
	}
	fclose(f);
	int fluxmax = getflow();
	
	FILE *g = fopen("maxflow.out","w");
	fprintf(g,"%d\n",fluxmax);
	fclose(g);
	
	return 0;
}