Cod sursa(job #279177)

Utilizator BaduBadu Badu Badu Data 12 martie 2009 18:23:09
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#include<string.h>

FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
int C[1001][1001];
int F[1001][1001];
int Q[10000],T[1001];
int n,m;

int BFS(){
	memset(T,0,sizeof(T));
	memset(Q,0,sizeof(Q));
	int p,u,x,i;
	Q[u=1]=1;
	T[1]=1;
	p=0;
	while(p<=u){
		x = Q[++u];
		for(i=1;i<=n;i++){
		 if(C[x][i]>F[x][i] && !T[i]){
			Q[++u]=i;
			T[i]=x;
			if(i==n) return 1;
		 }
		}
	}
	return 0;

}

int MIN(int a,int b){ return(a>b?b:a);}

int flux(){

	int flow=0,i;
	while(BFS()){
		for(i=1;i<n;i++){
			if(C[i][n]<=F[i][n] && T[i]<=0)continue;
			 T[n]=i;
			 int min = 1<<30;
			 int x;
			 for (x=n;x!=1;x=T[x])min=MIN(min,C[T[x]][x]-F[T[x]][x]);
			 if(!min) continue;
			 for(x=n;x!=1;x=T[x]){F[T[x]][x]+=min;F[x][T[x]]-=min;}
			 flow+=min;
			}
		}

	return flow;
}

void date(){
	int x,y,c;
	fscanf(f,"%d%d",&n,&m);
	for(;m--;){
		fscanf(f,"%d%d%d",&x,&y,&c);
		C[x][y]=c;
	}
}


int main(){

	date();
	fprintf(g,"%d",flux());
	return 0;
}