Cod sursa(job #291368)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 29 martie 2009 18:36:43
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#include <string.h>
#include <queue>
#define N 1001
using namespace std;
queue <int> coada;
int n,a[N][N],tata[N],viz[N],f;

int bf()
{int q,i;
 coada.push(1);

 while(!coada.empty())
 {q=coada.front();
  coada.pop();
  for (i=1;i<=n;i++)
  {if(viz[i]==0&&a[q][i]!=0)
   {if (i==n) 
     return q; 
    viz[i]=1;
    tata[i]=q;
    coada.push(i);
   }
  }
 }
 return 0;
}
void opt(int q)
{int i,min;
 for (i=q,min=a[q][n];i>1;i=tata[i])
 {if (min>a[tata[i]][i])
  min=a[tata[i]][i];
 }
 if(min==0)return;
 a[q][n]-=min;
 a[n][q]+=min;
 f+=min;
 for (i=q;i>1;i=tata[i])
 {a[tata[i]][i]-=min;
  a[i][tata[i]]+=min;
 }
}

int main ()
{int m,i,x,y,z,min,q;
 freopen("maxflow.in","r",stdin);
 freopen("maxflow.out","w",stdout);
 scanf("%d%d",&n,&m);
 for (i=1;i<=m;i++)
 {scanf("%d%d%d",&x,&y,&z);
  if(x!=y)
  a[x][y]=z;
 }
 f=0;
 while(q=bf())
 {opt(q);
  while(!coada.empty())
  {q=coada.front();
   coada.pop();
   if(a[q][n]!=0)
    opt(q);
  }
  while(!coada.empty());
  memset(viz,0,sizeof(viz));
  memset(tata,0,sizeof(tata));
 }
 printf("%d",f);
 return 0;
}