Cod sursa(job #425623)

Utilizator vladbBogolin Vlad vladb Data 25 martie 2010 21:49:00
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>

#define MAX 100000

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

int n,m,S,T,flow;
int c[1001][1001],f[1001][1001],x[1001],t[1001],pus[1001],r[1001];

void augment()
{	int j=T,i;
	while(j!=S)
	{	i=abs(t[j]);
		if(t[j]>=0) f[i][j]+=r[T];
		else f[j][i]-=r[T];
		j=i;
	}
	flow+=r[T];
}

int bf()
{	int st=1,dr=1,i;
	for(i=1;i<=T;i++)
	{	t[i]=0;
		pus[i]=0;
		x[i]=0;
	}
	x[1]=S;
	pus[S]=1;
	r[S]=MAX;
	while(st<=dr)
	{	int nod=x[st];
		for(i=1;i<=T;i++)
			if(pus[i]==0)
			{	if(c[nod][i]>f[nod][i])
				{	x[++dr]=i;
					pus[i]=1;
					t[i]=nod;
					if(c[nod][i]-f[nod][i]<r[nod])
						r[i]=c[nod][i]-f[nod][i];
					else r[i]=r[nod];
					if(i==T) return 1;
				}
				if(f[i][nod])
				{	x[++dr]=i;
					pus[i]=1;
					t[i]=-nod;
					if(f[i][nod]<r[nod]) 
						r[i]=f[i][nod];
					else r[i]=r[nod];
					if(i==T) return 1;
				}
			}
		st++;
	}
	return 0;
}

void flux()
{	while(bf())
		augment();
}

int main()
{	int i,x,y,z;
	fin>>n>>m;
	for(i=1;i<=m;i++)
	{	fin>>x>>y>>z;
		c[x][y]=z;
	}
	S=1;
	T=n;
	flux();
	fout<<flow;
	fin.close();
	fout.close();
	return 0;
}