Cod sursa(job #852244)

Utilizator andrettiAndretti Naiden andretti Data 11 ianuarie 2013 00:29:19
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
using namespace std;

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

int n,m,p,u,nrd,flux;
int d[1000],v[1000],t[1000],cc[1000];
int c[1000][1000],f[1000][1000];

void cit()
{
	int i,x,y,cost;
	
	fin>>n>>m;
	
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>cost;
		c[x][y]=cost;
		
	}
}

void creare(int k)
{
	if(k!=0)
	{
		creare(t[k]);
		d[++nrd]=k;
	}
}

int drum()
{
	int i,nod;
	
	for(i=1;i<=n;i++)
		v[i]=0;
	
	p=u=1; cc[1]=1; v[1]=1; t[1]=0;
	
	while(p<=u)
	{
		nod=cc[p];
		
		if(nod==n)
		{
			nrd=0;
			creare(n);
			return 1;
		}
		
		for(i=1;i<=n;i++)
			if(c[nod][i]>f[nod][i] && v[i]==0)
			{
				u++;
				cc[u]=i;
				t[i]=nod;
				v[i]=1;
			}
		p++;
	}
	
	return 0;
}

void flux_max()
{
	int i,min;
	
	while(drum())
	{
		min=999999;
		
		for(i=1;i<nrd;i++)
			if(min>c[d[i]][d[i+1]]-f[d[i]][d[i+1]])
			   min=c[d[i]][d[i+1]]-f[d[i]][d[i+1]];
			
		for(i=1;i<nrd;i++)
		{
			f[d[i]][d[i+1]]+=min;
			f[d[i+1]][d[i]]-=min;
		}
		
		flux+=min;
	}
}

int main()
{
	cit();
	flux_max();
	fout<<flux;
	
	fin.close();
	fout.close();
	return 0;
}