Cod sursa(job #302760)

Utilizator zbarniZajzon Barna zbarni Data 9 aprilie 2009 11:29:20
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<fstream.h>
#include<string.h>
#define nx 1025
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},viz[nx]={0};
  memset(tat,0,sizeof(tat));
  Q[1]=1;viz[1]=1;
  int e=1,v=1,nod,i;
  while (e<=v)
   {
    nod=Q[e++];
    for (i=1;i<=n;++i)
    if (!viz[i] && cap[nod][i]>flux[nod][i])
      {
       tat[i]=nod;
       Q[++v]=i;
       viz[i]=1;
      }
   }
  return viz[n];
 }

int fluxx()
 {
  int r,rez=0,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;
 }