Cod sursa(job #1644092)

Utilizator ris99Istrate Ruxandra ris99 Data 9 martie 2016 21:31:01
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <cstdio>
#include <cstring>
#define inf 16838
using namespace std;
int f[1002][1002],c[1002][1002],t[1002],flux,vf,n,m,x,y,c1;
ifstream f1("maxflow.in");
ofstream g("maxflow.out");
int bf(int s,int d)
{ int p,u,nod,i,q[1002];
  memset(t,0,sizeof(t));
  p=0;
  u=0;
  t[s]=-1;
  q[p]=s;
  for(;p<=u;p++)
  {nod=q[p];
  for(i=1;i<=n;i++)
    if(!t[i]&&c[nod][i]>f[nod][i])
  {q[++u]=i;
  t[i]=nod;
  if(i==d) return 1;
  }
  }
  return 0;
}
/*void flux_maxim()
{int i,r;
 for(flux=0;bf(1,n);flux+=r)
 { r=inf;
   i=n;
   while(i!=1)
   { r=min(r,c[t[i]][i]-f[t[i]][i]);
     i=t[i];

   }
    i=n;
    while(i!=1)
    { f[t[i]][i]+=r;
      f[i][t[i]]-=r;
      i=t[i];

    }
 }

}
void afis()
{ int i;
 for(i=1;i<=n;i++)
    vf+=f[i][n];
 g<<vf;

}
*/
void flux_maxim()
{ int i,j,r;
  for(flux=0;bf(1,n);)
  for(i=1;i<=n;i++)
  { if(t[i]==-1||c[i][n]<=f[i][n])
   continue;
   r=c[i][n]-f[i][n];
   for(j=i;j!=1&&j;j=t[j])
   r=min(r,c[t[j]][j]-f[t[j]][j]);
   if(r==0) continue;
   f[i][n]+=r;
   f[n][i]-=r;
   for(j=i;j!=1;j=t[j])
   {f[t[j]][j]+=r;
    f[j][t[j]]-=r;

   }
   flux+=r;
  }

}
int main()
{ f1>>n>>m;
  for(int i=1;i<=m;i++)
  { f1>>x>>y>>c1;
    c[x][y]=c1;

  }

 flux_maxim();
 //afis();
 g<<flux;
    return 0;
}