Cod sursa(job #250364)

Utilizator StigmaSimina Pitur Stigma Data 30 ianuarie 2009 19:38:10
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream.h>
#include <fstream.h>


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



int a[100][100],b[100][100],t[100],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[100],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] && i!=f)
       {u++; c[u]=i; t[i]=-nod;
	}
   }
return 0;
}







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

 fin>>n>>m;

 st=1;
 f=n;
while (fin>>x>>y>>cost) a[x][y]=+cost;



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

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

fout<<flux;

fout.close();
return 0;
}