Cod sursa(job #272560)

Utilizator zbarniZajzon Barna zbarni Data 7 martie 2009 13:58:33
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream.h>
#include<string.h>
#define nx 1025
#define min(x,y) ((x)<(y)?(x):(y))
int cap[nx][nx],flux[nx][nx];
int n,tat[nx],m;
int bfs(int s,int d)
 {
  memset(tat,0,sizeof(tat));
  tat[s]=-1;
  int Q[nx];Q[0]=s;
  for (int p=0,u=0;p<=u;++p)
    for (int i=1,nod=Q[p];i<=n;++i)
      if (!tat[i] && cap[nod][i]>flux[nod][i])
       {
	Q[++u]=i;
	tat[i]=1;
	if (i==d) return 1;
       }
  return 0;
 }

int FLUX()
 {
  int i,j,r,sz=0;
  for(;bfs(1,n);)
   for (i=1;i<=n;++i)
    {
     if (tat[i]<=0 || cap[i][n]<=flux[i][n])
       continue;
     r=cap[i][n]-flux[i][n];
     for (j=i;j!=1;j=tat[j])
      r=min(r,cap[tat[j]][j]-flux[tat[j]][j]);
     if (!r)
      continue;
     flux[i][n]+=r;
     flux[n][i]-=r;
     for (j=i;j!=1;j=tat[j])
      {
       flux[tat[j]][j]+=r;
       flux[j][tat[j]]-=r;
      }
     sz+=r;
    }
  return sz;
 }

int main()
 {
  ifstream be ("maxflow.in");
  ofstream ki ("maxflow.out");
  be>>n>>m;
  int x,y,z;
  for (int i=1;i<=m;++i)
   {
    be>>x>>y>>z;
    cap[x][y]=z;
   }
  be.close();
  ki<<FLUX()<<'\n';
  ki.close();
  return 0;
 }