Cod sursa(job #517686)

Utilizator bugyBogdan Vlad bugy Data 29 decembrie 2010 15:19:31
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define dim 1024 
#define dim2 5005
using namespace std;

int A[dim][dim],F[dim][dim],n,m,i,x,y,c,coada[dim2],viz[dim],min,u[dim2],s,d,j,ok,in,sf,flux,J,val,aux;


void citire()
{
	FILE *f=fopen("maxflow.in","r");
	
fscanf(f,"%d %d",&n,&m);

for(i=1;i<=m;i++)
{
	fscanf(f,"%d %d %d",&x,&y,&c);
	
	//coada[y]=1;	
	//viz[x]=1; 	
	A[x][y]=c;
	
}


fclose(f);
}

void bfs(int x)
{
	
	
	viz[x]=1;
	coada[1]=x; in=sf=1; 
	
	while(in<=sf && !viz[d])
	{
	x=coada[in++]; J=in-1;
	for(i=1;i<=n;i++)
		if(! viz[ i ])
			if(F[x][i]<A[x][i] )
			{
				viz[i]=A[x][i]-F[x][i];
				coada[++sf]=i;
				u[sf]=J;		
			}
			else if( F[i][x]>0 )
			{
				viz[i]=F[i][x];
				coada[++sf]=i;
				u[sf]=J;
			}
				
			
	}
	if(!viz[d])
	ok=0;
	viz[1]=0;
	return;


}


int main()
{
	FILE *g=fopen("maxflow.out","w");
	citire();

	s=1; d=n;

	ok=1;
	while(ok)
	{
		
		bfs(s);
		min=10000;
		if(ok)
		{
		for(j=sf;j>1;j)
		{
			y=coada[j];
			
			val=viz[y];
			
			if(val<min)
				min=val;
			
		j=u[j];
		}
		
		for(j=sf;j>1;j)
		{
			x=coada[u[j]];
			y=coada[j];
			
			if(A[x][y]>0)
				F[x][y]+=min;
			else F[y][x]-=min;
			
		j=u[j];
		}
			
		memset(coada,0,sizeof(coada));	
		memset(viz,0,sizeof(viz));	
		}
		
		
	}
	
for(i=1;i<=n;i++)
	flux+=F[s][i];

fprintf(g,"%d\n",flux);

return 0;
}