Cod sursa(job #346329)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 7 septembrie 2009 14:58:12
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<stdio.h>
#define min(x,y) (x<y?x:y)
#define Nmax 1010
#define Mmax 5010

FILE *fin=fopen("maxflow.in","r"),
	*fout=fopen("maxflow.out","w");

int N,M,S,D,F;
int A[Nmax][Nmax],T[Nmax];
char viz[Nmax];
int coada[Nmax];

int bfs()
{
	for(int i=1;i<=N;i++) viz[i]=0;
	int li,lf;
	li=lf=1;
	coada[li]=S;
	viz[S]=1;
	while(li<=lf)
	{
		int nod=coada[li++];
		for(int i=1;i<=N;i++)
			if(A[nod][i] && !viz[i])
			{
				T[i]=nod;
				viz[i]=1;
				coada[++lf]=i;
				if(i==D)
					return 1;
			}
	}
	return 0;
}

void afis()
{
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=N;j++)
			printf("%d ",A[i][j]);
		printf("\n");
	}
	printf("\n");
}

int main()
{
	fscanf(fin,"%d %d",&N,&M);
	S=1;D=N;T[S]=-1;
	for(int i=1;i<=M;i++)
	{
		int x,y,z;
		fscanf(fin,"%d %d %d",&x,&y,&z);
		A[x][y]=z;
	}

	//afis();
	int flow;
	while(bfs())
	{
		flow=1000000;
		for(int i=D;T[i]!=-1;i=T[i])
			flow=min(flow,A[T[i]][i]);
		for(int i=D;T[i]!=-1;i=T[i])
		{
			A[i][T[i]]+=flow;
			A[T[i]][i]-=flow;
		}
		F+=flow;
		//printf("%d\n",flow);
		//afis();
	}
	fprintf(fout,"%d\n",F);
	fclose(fin);
	fclose(fout);
	return 0;
}