Cod sursa(job #302738)

Utilizator zbarniZajzon Barna zbarni Data 9 aprilie 2009 11:13:52
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream.h>
#include<string.h>
#define nx 1023
int cap[nx][nx],flux[nx][nx];
int n,m,tat[nx];
inline int min(int a,int b)
 {
  if (a<b) return a;
  return b;
 }

int bfs()
 {
  int Q[nx]={0};
  memset(tat,0,sizeof(tat));
  Q[0]=1;
  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])
      {
       tat[i]=nod;
       Q[++u]=i;
       if (i==n) return 1;
      }
  return 0;
 }

int fluxx()
 {
  int r,rez,j;
  while (bfs())
    for (int i=1;i<=n;++i)
     if (cap[i][n]>flux[i][n])
      {
       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]);
       for (j=i;j!=1;j=tat[j])
	{
	 flux[tat[j]][j]+=r;
	 flux[j][tat[j]]-=r;
	}
       rez+=r;
       flux[i][n]+=r;
       flux[n][i]-=r;
      }
  return rez;
 }

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