Cod sursa(job #290414)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 27 martie 2009 21:51:52
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <string.h>
#define N 1001
#define INF 120000
int n,m,a[N][N];
int tata[N];
int viz[N];

struct nod
{int n;
 nod* urm;
}*prim,*ultim;

void push(int n)
{nod *p=new nod;
 p->n=n;
 if(prim==0)
  prim=p;
 else
  ultim->urm=p;
 p->urm=NULL;
 ultim=p; 
}

int pop()
{nod *p=prim;
 int a=p->n;
 prim=prim->urm;
 delete p;
 return a;
}

int bf()
{int flag=0,q,i;//presupunem ca nu da de sursa
 push(1);
 while(prim!=0)
 {q=pop();
  for (i=1;i<=n;i++)
  {if(viz[i]==0&&a[q][i]>0)
   {tata[i]=q;
    if(i==n){return 1;}
    push(i);
    viz[i]=1;
   }
  }
 }
 return 0; 
}


int main ()
{int i,j,f,x,y,z,min,max;
 prim=NULL;ultim=NULL;
 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;//muchie de la x la y cu capacitatea z
 }
 f=0;
 while(bf())
 {for (i=n,max=INF;i>1;i=tata[i])
  {if(a[tata[i]][i]<max)
   {max=a[tata[i]][i];
   }
  }  
  for (i=n;i>1;i=tata[i])
  {a[tata[i]][i]-=max;
   a[i][tata[i]]+=max;   
  }
  f+=max;
  
  memset(tata,0,sizeof(tata));
  memset(viz,0,sizeof(viz));
  while(prim!=0)pop();
 }
 printf("%d",f);
 
 
 return 0;
}