Cod sursa(job #695788)

Utilizator ursu-valiJerdea Florin ursu-vali Data 28 februarie 2012 14:45:04
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<stdio.h>
#include<vector>
#define infile "maxflow.in"
#define outfile "maxflow.out"
#define nmax 1024
#define inf 0x0fffffff

using namespace std;

long cap[nmax][nmax]; //capacitatea maxima pe muchia i,j
long flx[nmax][nmax]; // fluxul pe muchia i,j
long nrv[nmax]; //numarul vecinilor nodului i
long viz[nmax]; // starea elementului i
long n,m;//nr noduri ,nr muchii
long tt[nmax]; //tatal nodului i
long cd[nmax]; //coada

vector<long> v[nmax]; //vecinii nodului i

long vmin( long a,long b)
{
	if (a>b)
		return b;
	return a;
}

void read()
{
	int x,y,z;
	scanf("%ld %ld",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%ld %ld %ld",&x,&y,&z);
		cap[x][y]=z;
		nrv[x]++;
		nrv[y]++;
		v[x].push_back(y);
		v[y].push_back(x);
	}
}

int bf()
{
	int nod,vc;
	cd[0]=1;
	cd[1]=1;
	for(int i=1;i<=n;i++)
		viz[i]=0;
	for(int i=1;i<=cd[0];i++)
	{
		nod=cd[i];
		for(int j=0;j<nrv[nod];j++)
		{
			vc=v[nod][j];
			if(cap[nod][vc]==flx[nod][vc] || viz[vc])
				continue;
			viz[vc]++;
			cd[++cd[0]]=vc;
			tt[vc]=nod;
			if(vc==n)
				return 1;
		}
	}
	return 0;
}
int main()
{
	int flux,s=0,fmin;
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	
	while(bf())
	{
		fmin=inf;
		for(int i=n;i!=1;i=tt[i])
		{
			fmin=vmin(fmin , cap[tt[i]][i]-flx[tt[i]][i]);
		}
		for(int i=n;i!=1;i=tt[i])
		{
			flx[tt[i]][i]+=fmin;
			flx[i][tt[i]]-=fmin;
		}
		s+=fmin;
	}
	printf("%ld",s);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}