Cod sursa(job #696055)

Utilizator gabriel93Robu Gabriel gabriel93 Data 28 februarie 2012 16:33:48
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<stdio.h>
#include<cstring>
using namespace std;
FILE *f,*g;
int n,m,cap[1002][1002],flux[1002][1002],viz[1002],cd[1002],t[1002];

struct nod
{
	int v;
	nod *adresa;
};
nod *a[1002];

void adaug(int x,int y)
{
	nod *p;
	p=new nod;
	p->v=y;
	p->adresa=a[x];
	a[x]=p;
	
	p=new nod;
	p->v=x;
	p->adresa=a[y];
	a[y]=p;
}

void citire()
{
	int i,x,y,c;
	f=fopen("maxflow.in","rt");
	fscanf(f,"%d %d",&n,&m);
	memset(a,0,sizeof(a));
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&x,&y,&c);
		cap[x][y]=c;
		adaug(x,y);
	}
	fclose(f);
}
int vmin(int x,int y)
{
	return(x<y)?x:y;
}

int bf()
{
	nod *q;
	int p,u,nod;
	cd[1]=1;
	u=1; p=1;
	while(p<=u)
	{
		nod=cd[p];
		for(q=a[cd[p]];q!=0;q=q->adresa)
		{
			if(cap[nod][q->v] == flux[nod][q->v] || viz[q->v]==1)
				continue;
			u++;
			cd[u]=q->v;
			t[q->v]=nod;
			if(q->v==n)
				return 1;
		}
		p++;
	}
	return 0;
}

int main()
{
	int s,i,fmin;
	citire();
	s=0;
	while(bf()!=0)
	{
		fmin=10000000;
		for(i=n;i!=1;i=t[i])
			fmin=vmin(fmin,cap[t[i]][i]-flux[t[i]][i]);
		for(i=n;i!=1;i=t[i])
		{
			flux[t[i]][i]+=fmin;
			flux[i][t[i]]-=fmin;
		}
		s=s+fmin;
	}
	g=fopen("maxflow.out","wt");
	fprintf(f,"%d",s);
	fclose(g);
	return 0;
}