Cod sursa(job #3467)

Utilizator gigi_becaliGigi Becali gigi_becali Data 26 decembrie 2006 12:37:58
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <string>
#define oo 0x3f3f3f3f
#define maxn 128

int c[maxn][maxn], n, f, l, m;

void citire()
{
  // freopen("maxflow.in", "r", stdin);
  scanf("%d %d %d %d\n", &n,&m, &f, &l);
  for(int i=1;i<=m;i++)
    {
      int p, q, w;
      scanf("%d %d %d\n", &p, &q ,&w);
      c[p][q]=w;
    }

}

int min(int a, int b) { if(a<b) return a; return b;}

int bfs(int s, int l)
{
  int Q[maxn],viz[maxn],pred[maxn], p=1, q=1, u,i,cap;
  memset(viz,0, sizeof(viz));
  memset(pred, -1, sizeof(pred));
  Q[1]=s;
  viz[s]=1;
 
  while(p<=q)
    {
      u=Q[p++];

      for(i=1;i<=n;i++)
	if(c[u][i]>0 && !viz[i])
	  {
	    viz[i]=1;
	    pred[i]=u;
	    Q[++q]=i;
	   if(i==l) goto exit_loop;
	  }
    }
  exit_loop:
 
  if(pred[l]==-1) return 0;

  for(u=l, cap=oo ; pred[u]!=-1 ; u=pred[u]) cap=min(cap,c[pred[u]][u]);

  for(u=l; pred[u]!=-1; u=pred[u])
    {
      c[pred[u]][u]-=cap;
      c[u][pred[u]]+=cap;
    }


 return cap;
 
}
  


int max_flow(int s, int l)
{
  int flow=0;
  int p;
  while(1)
    {
      p=bfs(s, l);
      if(p==0) break;
      flow+=p;
    }

  return flow;
}


int main()
{
  citire();
  printf("%d\n", max_flow(f, l));
  return 0;
}