Cod sursa(job #574087)

Utilizator maritimCristian Lambru maritim Data 6 aprilie 2011 20:10:43
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<vector>

int cap[1001][1001];
int flow[1001][1001];
int N;
int M;
int TT[1001];
short int viz[1001];
long int Fmin;
long int MAX;

void citire(void)
{
	int a;
	int b;
	int z;
	FILE *f = fopen("maxflow.in","r");
	
	fscanf(f,"%d %d",&N,&M);
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d %d",&a,&b,&z);
		cap[a][b] = z;
	}
	
	fclose(f);
}

int parcurgere(void)
{
	int C[1001];
	memset(viz,0,sizeof(viz));
	memset(TT,0,sizeof(TT));
	int pi = 1;
	int pf = 1;
	C[1] = 1;
	viz[1] = 1;
	TT[1] = 0;
	while(pi<=pf)
	{
		for(int i=1;i<=N;i++)
			if(cap[C[pi]][i]-flow[C[pi]][i]>0 && !viz[i])
			{
				C[++pf] = i;
				TT[i] = C[pi];
				viz[i] = 1;
				if(i == N)
					return 1;
			}
		pi ++;
	}
	return 0;
}

void fluxmax(void)
{
	for(MAX;parcurgere();MAX += Fmin)
	{
		Fmin = 2000000;
		for(int i=N;i!=1;i = TT[i])
			if(Fmin>cap[TT[i]][i]-flow[TT[i]][i])
				Fmin = cap[TT[i]][i]-flow[TT[i]][i];
		
		for(int i=N;i!=1;i = TT[i])
			flow[TT[i]][i] += Fmin;
//			flow[i][TT[i]] -= Fmin;
	}
}

int main()
{
	FILE *f = fopen("maxflow.out","w");
	
	citire();
	fluxmax();
	fprintf(f,"%d ",MAX);
	
	fclose(f);
	return 0;
}