Cod sursa(job #248646)

Utilizator StigmaSimina Pitur Stigma Data 26 ianuarie 2009 13:30:20
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream.h>
#include <fstream.h>


ifstream fin("maxflow.in");
ofstream fout("maxflow.out");



int a[1000][1000],b[1000][1000],t[1000],flux,n,st,f;



void minim(int i, int min)
{if (i!=st)
  if (t[i]>0)
    {if (min>a[t[i]][i]-b[t[i]][i]) min=a[t[i]][i]-b[t[i]][i];
     minim(t[i],min);
     b[t[i]][i]+=min;
    }
    else
     {if (min>b[i][-t[i]]) min=b[i][-t[i]];
      minim(-t[i],min);
      b[i][-t[i]]-=min;
     }
}




int drum()
{int c[1000],p=1,u=1,nod,i;
 memset(t,0,sizeof(t));
 c[1]=st;
 t[st]=-1;



 for (p=1;p<=u;p++)
  {nod=c[p];
   for (i=1;i<=n;i++)
    if (a[nod][i]-b[nod][i]>0 && !t[i])
     {u++; c[u]=i; t[i]=nod;
      if (i==f) return 1;
      }
      else
       if (b[i][nod]>0 && !t[i])
       {u++; c[u]=i; t[i]=-nod;
       if (f==i) return 1;
	}
   }
return 0;
}







int main()
{int x,y,cost,m,i;

 fin>>n>>m;

for (i=1;i<=m;i++)
 {fin>>x>>y>>cost; a[x][y]=cost;}
st=1;
f=n;



while (drum())
minim(f,30000);

for (i=1;i<=n;i++)
 flux+=a[st][i];

fout<<flux;

fout.close();
return 0;
}