Cod sursa(job #582000)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 14 aprilie 2011 19:44:06
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;

int n,m,fluxmax;
bool viz[1010];
FILE *f;
FILE *g;

typedef struct nod
{
	int inf,c;
	nod *urm,*inv;
} NOD;
typedef NOD *graf[1010];
graf G;


void citire()
{
	f=fopen("maxflow.in","r");
	fscanf(f,"%d %d",&n,&m);
	NOD *p;
	for(int i=1;i<=m;i++)
	{
		int x,y,C;
		fscanf(f,"%d %d %d",&x,&y,&C);
		p=new NOD;
		p->inf=y;
		p->urm=G[x];
		p->c=C;
		NOD *q=p;
		G[x]=p;
		p=new NOD;
		q->inv=p;p->inv=q;
		p->inf=x;
		p->urm=G[y];
		p->c=0;
		G[y]=p;
	}
}

int minimul(int a,int b)
{
	if(a<b)
		return a;
	return b;
}

int DF(int k,int minn)
{
	NOD *p=G[k];
	while(p)
	{
		if(!viz[p->inf]&&p->c>0)
		{
			viz[p->inf]=true;
			if(p->inf==n)
			{	
				viz[p->inf]=false;
				int x=minimul(p->c,minn);
				p->c-=x;
				p->inv->c+=x;
				return x;
			}
			else
			{
				int df=DF(p->inf,minimul(p->c,minn));
				if(df)
				{
					viz[p->c]=false;
					p->c-=df;
					p->inv->c+=df;
					return df;
				}
				viz[p->inf]=false;
			}
		}
		p=p->urm;
	}
	return 0;
}

int main()
{
	citire();
	int df=DF(1,INF);
	while(df)
	{
		fluxmax+=df;
		df=DF(1,INF);
	}
	g=fopen("maxflow.out","w");
	fprintf(g,"%d\n",fluxmax);
	fclose(f);
	fclose(g);
	return 0;
}