Cod sursa(job #428357)

Utilizator vladbBogolin Vlad vladb Data 29 martie 2010 10:25:29
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<vector>

#define MAX 100000

using namespace std;

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

vector <int> v[1001];
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,nod;
	unsigned int j;
	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)
	{	nod=x[st];
		for(j=0;j<v[x[st]].size();j++)
		{	i=v[nod][j];
			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;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	S=1;
	T=n;
	flux();
	fout<<flow;
	fin.close();
	fout.close();
	return 0;
}