Cod sursa(job #246518)

Utilizator vlad2179Popescu Vlad Alexandru vlad2179 Data 21 ianuarie 2009 00:02:59
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NMAX 1001
#define IN "maxflow.in"
#define OUT "maxflow.out"
#define INF 1<<31

FILE *f=fopen(IN,"rt");
FILE *g=fopen(OUT,"wt");

int *G[NMAX],viz[NMAX];
int F[NMAX][NMAX];
int C[NMAX][NMAX];
int D[NMAX],n,m;
int Q[NMAX],flux;

void date(){
	int i,x,y,c;	
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++){G[i]=(int *)realloc(G[i],(sizeof(int)));G[i][0]=0;}
	for(i=1;i<=m;i++){ 
		fscanf(f,"%d%d%d",&x,&y,&c); C[x][y]=c;
		G[x][0]++;
		G[x]=(int*)realloc(G[x],(G[x][0]+1)*sizeof(int));
		G[x][G[x][0]]=y;
	}
}
int min(int a, int b){ return (a<b?a:b); }
int bfs(){
	int p,l,nd,vf,i;
	memset(viz,0,sizeof(viz));
	Q[1]=1;
	viz[1]=1;
	l=1;p=0;
	for(;p<=l && !viz[n];){
		nd=Q[++p];
		if(nd==n) continue;
		for(i=1;i<=G[nd][0];i++){
			vf = G[nd][i];
			if(F[nd][vf] == C[nd][vf] || viz[vf]) continue;
			Q[++l]=vf;
			viz[vf]=1;
			D[vf]=nd;
		}
	}
	return viz[n];
}

void solve(){
	int i,minn;
	for(;bfs();){minn=INF;
		for(i=n;i!=1;i=D[i])minn = min(minn,C[D[i]][i] - F[D[i]][i]);
		if(!minn) continue;
		for(i=n;i!=1;i=D[i]){
			F[D[i]][i] += minn;
			F[i][D[i]] -= minn;
		}
	flux+=minn;
	}
}

int main(){
	date();
	solve();
	fprintf(g,"%d",flux);

	return 0;
}