Cod sursa(job #318165)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 27 mai 2009 12:19:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 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];
	memset(viz,0,sizeof(viz));   
    viz[1]=-1;   
    Q[0]=1;
	for (p=0,u=0;p<=u;p++)   
        for (i=1,x=Q[p];i<=n;++i)   
            if (!viz[i] && c[x][i]>f[x][i])   
            {   
                viz[Q[++u]=i]=x;   
                if (i==n)   
                    return true;   
            }   

	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;
}