Cod sursa(job #721088)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 23 martie 2012 11:52:06
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>
#include <string.h>
int n,m,a[1005][1005],b[1005][1005],t[1005],s,f,inf=999999;
void read(){
	FILE *fin=fopen("maxflow.in","r");
	fscanf(fin,"%d %d\n",&n,&m);
	s=1;
	f=n;
	int i,x,y,z;
	for(i=1;i<=m;i++){
		fscanf(fin,"%d %d %d\n",&x,&y,&z);
		a[x][y]=z;
	}
	fclose(fin);
}
int drum(){
	int p,u,c[1005],i,nod;
	c[1]=s;
	p=u=1;
	t[s]=s;
	while(p<=u){
		nod=c[p];
		for(i=1;i<=n;i++){
			if(a[nod][i]-b[nod][i]>0){
				if(t[i]==0){
					u++;
					c[u]=i;
					t[i]=nod;
					if(i==f)
						return 1;
				}
			}
		}
		p++;
	}
	return 0;
}
void imbunatatire(int k,int &min){
	if(k!=s){
		if(min>a[t[k]][k]-b[t[k]][k]&&a[t[k]][k]-b[t[k]][k]>0)
			min=a[t[k]][k]-b[t[k]][k];
		imbunatatire(t[k],min);
		b[t[k]][k]+=min;
	}
}
void write(){
	int i,j;
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++)
			printf("%d ",b[i][j]);
		printf("\n");
	}
}
void write_drum(int k){
	if(k==s){
		printf("%d ",s);
	}
	else{
		printf("%d ",k);
		write_drum(t[k]);
	}
}
int main(){
	read();
	int sw=drum(),min,i;
	while(sw){
		min=inf;
		imbunatatire(f,min);
		memset(t,0,sizeof(t));
		sw=drum();
	}
	int sum=0;
	for(i=1;i<=n;i++)
		sum+=b[s][i];
	freopen("maxflow.out","w",stdout);
//	write();
	printf("%d\n",sum);
	fclose(stdout);
	return 0;
}