Cod sursa(job #296477)

Utilizator ghiutaalexGhiuta Alex ghiutaalex Data 4 aprilie 2009 20:56:52
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<stdio.h>
#include<string.h>
#include<values.h>
FILE*f=fopen("maxflow.in","r");
FILE*g=fopen("maxflow.out","w");

int n,m,s,d,coada[1001],viz[1001],gre[1001],gri[1001];
long fl[1001][1001],F,c[1001][1001];

void citire()
{
 int i,x,y,C;
 fscanf(f,"%d%d",&n,&m);
 for(i=1;i<=m;i++)
	{
	 fscanf(f,"%d%d%d",&x,&y,&C);
	 c[x][y]=C;
	 gre[x]++;
	 gri[y]++;
	}
 for(i=1;i<=n;i++)
	{
	 if(gre[i]==0) d=i;
	 if(gri[i]==0) s=i;
	}
}

long minim(long x,long y)
{
 if(x<y) return x;
 return y;
}

int bf()
{
 int p,u,x,i;
 p=u=1;
 coada[p]=s;
 memset(viz,0,sizeof(viz));
 viz[s]=1;
 while(p<=u)
	{
	 x=coada[p++];
	 for(i=1;i<=n;i++)
		if(!viz[i]) if(fl[x][i]<c[x][i]) {
						  viz[i]=x;
						  coada[++u]=i;
						 }
			    else if(fl[i][x]>0) {
						 viz[i]=-x;
						 coada[++u]=i;
						}
	}
 return viz[d];
}

void ek()
{
 int i,l[101],lg,v;
 long a,b;
 a=b=MAXLONG;
 do {
     if(!bf()) return;
     l[0]=d;lg=0;
     while(l[lg]!=s)
	{
	 ++lg;
	 if(viz[l[lg-1]]>0) l[lg]=viz[l[lg-1]];
	 else if(viz[l[lg-1]]<0) l[lg]=-viz[l[lg-1]];
	 if(viz[l[lg-1]]>0)
		a=minim(a,c[l[lg]][l[lg-1]]-fl[l[lg]][l[lg-1]]);
	 else if(viz[l[lg-1]]<0)
		b=minim(b,fl[l[lg-1]][l[lg]]);
	}
     v=minim(a,b);
     for(i=lg;i>=1;i--)
	if(viz[l[i-1]]>0) fl[l[i]][l[i-1]]+=v;
	else fl[l[i-1]][l[i]]-=v;
    }
 while(1);
}

int main()
{
 int i;
 citire();
 ek();
 for(i=1;i<=n;i++)
	F+=fl[i][d];
 fprintf(g,"%ld",F);
 fcloseall();
 return 0;
}