Cod sursa(job #252285)

Utilizator otilia_sOtilia Stretcu otilia_s Data 4 februarie 2009 10:16:25
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <stdio.h>
#include <string.h>
#include <math.h>
#define NMAX 1001
int F[NMAX][NMAX],C[NMAX][NMAX],viz[NMAX],L[NMAX];
int n,m,s,d;

void citire()
{
 int gi[NMAX],go[NMAX];
 memset(gi,0,sizeof(gi)); memset(go,0,sizeof(go));
 FILE *fin=fopen("maxflow.in","r");
 fscanf(fin,"%d %d",&n,&m);
 memset(C,0,sizeof(C));
 for (int i=1;i<=m;i++)
  { int x,y,c;
   fscanf(fin,"%d %d %d",&x,&y,&c);
   C[x][y]=c;
   gi[y]++; go[x]++;
  }
 s=d=0;
 for (i=1;i<=n&&(!s||!d);i++)
  {
   if (!gi[i]) s=i;
   if (!go[i]) d=i;
  }
 fclose(fin);
}

int bfs()
{ int Q[NMAX],p,u,x,i;
 Q[0]=s; p=u=0;viz[s]=1;
 while (p<=u)
  {
   x=Q[p++];
   for (i=1;i<=n;i++)
    if (!viz[i])
     if (C[x][i]>F[x][i]) {viz[i]=x; Q[++u]=i;}
	else
     if (F[i][x]>0) {viz[i]=-x; Q[++u]=i;}
  }
 return (viz[d]);
}

inline int min(int x, int y)
{
 return (x<y?x:y);
}

void ek()
{ int lg,i,v; int a,b;
 do
  {
   memset(viz,0,sizeof(viz));
   if (!bfs()) return;
   L[0]=d; lg=0; a=b=120000;
   while (L[lg]!=s)
    {
     ++lg;
     L[lg]=abs(viz[L[lg-1]]);
     if (viz[L[lg-1]]>0) a=min(a,C[L[lg]][L[lg-1]]-F[L[lg]][L[lg-1]]);
	else
	if (viz[L[lg-1]]<0) b=min(b,F[L[lg-1]][L[lg]]);
    }
   v=min(a,b);
   for (i=lg;i>0;i--)
    if (viz[L[i-1]]>0) F[L[i]][L[i-1]]+=v;
       else F[L[i-1]][L[i]]-=v;
  }
 while (1);
}


void afisare()
{ int i;
 FILE *fout=fopen("maxflow.out","w");
 long max=0;
 for (i=1;i<=n;i++)
  max+=F[i][d];
 fprintf(fout,"%ld\n",max);
 fclose(fout);
}

int main()
{
 citire();
 ek();
 afisare();
 return 0;
}