Cod sursa(job #318164)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 27 mai 2009 12:09:46
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define file_in "maxflow.in"
#define file_out "maxflow.out"

#define Nmax 1111
#define Inf 0x3f3f3f3f

int f[Nmax][Nmax];//fluxul
int c[Nmax][Nmax];//capacitatea
int n,m,x,y,co,viz[Nmax],max_flow;


void citire()
{
	int i;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n,&m);
	for (i=0;i<m;++i)
	{
		scanf("%d %d %d", &x,&y,&co);
	    c[x][y]=co;
	}
}

bool bfs()
{
	int i,p,u,Q[Nmax];
	Q[0]=1;
	p=u=0;
	viz[1]=-1;
	while(p<=u)
	{
		x=Q[p];
		for (i=1;i<=n;++i)
			 if (!viz[i])
				 if (c[x][i]>f[x][i])
                 {
					Q[++u]=i;
					viz[i]=x;
					if (i==n)
						return true;
				 }
		p++;		 
	}
	return false;
}
	

inline int abs(int a) {return a>=0?a:-a;}

int ek()
{
	int i,v,j;
    max_flow=0;
	for (;bfs();)
		for (i=1;i<=n;++i)
		{
			 if (viz[i]<=0 || c[i][n]<=f[i][n])   
                 continue;   
             v=c[i][n]-f[i][n]; 
             for (j=i;j!=1;j=viz[j])   
                v=min(v,c[viz[j]][j]-f[viz[j]][j]);   
             
			 if (v==0) continue;
			 f[i][n]+=v;
			 f[n][i]-=v;
             
			 for (j=i;j!=1;j=viz[j])   
             {
				 f[viz[j]][j]+=v;
				 f[j][viz[j]]-=v;
			 }
			 max_flow+=v;
		}
    return max_flow; 
}

void afisare()
{
	printf("%d", ek());
}

int main()
{
	citire();
	afisare();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}