Cod sursa(job #291253)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 29 martie 2009 16:41:48
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>
#include <string.h>
#define N 5
int n,a[N][N],tata[N],viz[N],f;
struct nod
{int n;
 nod *urm;
}*prim,*ultim;
void push(int k)
{nod *p=new nod;
 p->n=k;
 p->urm=NULL;
 if(prim==NULL)
  prim=p;
 else
  ultim->urm=p;
 ultim=p;
}

int pop()
{int k;nod* p;
 p=prim;k=prim->n;
 prim=prim->urm;
 delete p;
 return k;
}
int bf()
{int q,i;
 push(1);
 while(prim!=NULL)
 {q=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;
    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];
 }
 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);
  a[x][y]=z;
 }
 while(q=bf())
 {opt(q);
  do
  {while(prim!=NULL)
   {q=pop();
    if(a[q][n]!=0)break;
   }
   opt(q);
  }while(prim!=NULL);
  memset(viz,0,sizeof(viz));
  memset(tata,0,sizeof(tata));
 }
 i=i;
 printf("%d",f);
 return 0;
}