Cod sursa(job #566617)

Utilizator DanutzRusu Dan Andrei Danutz Data 29 martie 2011 10:23:25
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

#define inf 0x3f3f

int c[1010][1010],F[1010][1010],n,m;

int Q[1010],t[1010],min;

int flux,S,D,sw;

FILE *f,*g;

void cit(){
	int i,j,x;
	f=fopen("maxflow.in","r");
	fscanf(f,"%d %d ",&n,&m);
	
	for (;m;--m)
	{
		fscanf(f,"%d %d %d",&i,&j,&x);
		c[i][j]=x;
	}
	
	S=1;
	
	D=n;
	
	fclose(f);
}

void afis(){
	int i;
	flux=0;
	for (i=1;i<=n;i++)
		flux+=F[i][D];
	
	g=fopen("maxflow.out","w");
	fprintf(g,"%d\n",flux);
	
	fclose(g);
}

void gasire_drum(){
	int p,u,k,i;
	
	p=u=1;
	
	Q[u]=S;
	sw=0;
	
	while (p<=u && !sw)
	{
		k=Q[p];
		
		for (i=1; i<=n && !sw; i++)
			if (c[k][i] > F[k][i] && !t[i])
			{
				t[i]=k; u++; Q[u]=i;
				if (Q[u]==D)
					sw=1;
			}
			else
				if (F[i][k]>0 && !t[i] && i!=S)
				{
					t[i]=-k; 
					u++;
					Q[u]=i;
				}
	p++;
	}
}

void imbunatatire(int k){
	if (k!=S)
		if (t[k]>0)
		{
			if (c[t[k]][k]-F[t[k]][k]<min)
				min=c[t[k]][k]-F[t[k]][k];
			imbunatatire(t[k]);
			F[t[k]][k]+=min;
		}
		else
		{
			if (F[k][abs(t[k])]<min)
			min=F[k][abs(t[k])];
			imbunatatire(abs(t[k]));
            F[k][abs(t[k])]-=min;
		}
}

int main(){
	cit();
	do{
		memset(t,0,sizeof(t));
		
		gasire_drum();
		
		if (sw)
		{
			min=inf;
			imbunatatire(D);
		}
		
	}while (sw);
	
	afis();
	
	return 0;
}