Cod sursa(job #303347)

Utilizator rethosPaicu Alexandru rethos Data 9 aprilie 2009 19:25:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <string.h>
#define NM 1001
#define min(x,y) ((x)>(y)?(y):(x))
int n,m;
int a[NM][NM];
int c[NM];
int fr[NM];
int nrfr;
int t[NM];
int viz[NM];
int flux;
int minim;
struct list{int nod;list* urm;}*g[NM];
inline void add(int x,int y)
{list *p=new list;
 p->nod=y;
 p->urm=g[x];
 g[x]=p;
}
void df(int);
int main()
{freopen("maxflow.in","r",stdin);
 freopen("maxflow.out","w",stdout);
 scanf("%d %d",&n,&m);
 int x,y,c,i;
 while (m--)
	 {scanf("%d %d %d",&x,&y,&c);
	  add(x,y);
	  add(y,x);
	  a[x][y]=c;
	 }
 nrfr=1;
 while (nrfr)
	 {nrfr=0;
	  memset(viz,0,sizeof(viz));
	  df(1);
	  for (i=1;i<=nrfr;i++)
		  {x=fr[i];
		   minim=a[x][n];
		   while (x!=1)
			   {minim=min(minim,a[t[x]][x]);
			    x=t[x];
			   }
		   flux+=minim;
		   x=fr[i];
		   a[x][n]-=minim;
		   while (x!=1)
			   {a[t[x]][x]-=minim;
			    a[x][t[x]]+=minim;
			    x=t[x];
			   }
		  }
	}
 printf("%d",flux);
 return 0; 
}
void df(int k)
{int x,st,dr;
 st=dr=1;
 viz[k]=1;
 c[st]=k;
 list *p;
 nrfr=0;
 while (st<=dr)
	 {x=c[st++];
	  for (p=g[x];p;p=p->urm)
	    if (a[x][p->nod])
		  {if (p->nod==n)
			  {nrfr++;
			   fr[nrfr]=x;
			  }
			else if (!viz[p->nod])
			  {c[++dr]=p->nod;
			   t[p->nod]=x;
			   viz[p->nod]=1;
		      }
		  }
	 }	  	 
}