Cod sursa(job #247733)

Utilizator vlad2179Popescu Vlad Alexandru vlad2179 Data 23 ianuarie 2009 21:19:02
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#include<string.h>
#define NMAX 1002

int F[NMAX][NMAX];
int C[NMAX][NMAX];
int T[NMAX],n,m,flow;
int Q[NMAX];


inline int min(int a,int b){ return (a<b?a:b); }

int BFS(){
	int f=0,u=0,j,nod;
	memset(T,0,sizeof(T));
	memset(Q,0,sizeof(Q));
	Q[++u] = 1;T[1]=-1;

	for(f=0;f<=u;){nod=Q[++f];
		for(j=1;j<=n;j++){
			if(!T[j] && C[nod][j]>F[nod][j]){
				Q[++u]=j;
				T[j]=nod;
				if(j==n) return 1;

			}
		}
	}return 0;
}

void max_flow(){
	int i,rez,j;
	for(;BFS();){
		for(i=1;i<=n;i++){
			if(C[i][n]<=F[i][n] || T[i]<0) continue;
			rez=C[i][n]-F[i][n];
			for(j=i;j!=1;j=T[j]) rez=min(rez,C[T[j]][j] - F[T[j]][j]);
			if(!rez) continue;
			F[i][n]+=rez;F[n][i]-=rez;
			for(j=i;j!=1;j=T[j]) {F[T[j]][j]+=rez;F[j][T[j]]-=rez;}
			flow+=rez;
		}
		
	}
}

int main(){
    freopen("maxflow.out","w",stdout);
	freopen("maxflow.in","r",stdin);
	int i,x,y,c;
	scanf("%d%d",&n,&m);
	for(i=0;i<=m;++i) {scanf("%d%d%d",&x,&y,&c);C[x][y]=c;}
	max_flow();
	printf("%d",flow);
	return 0;
}