Cod sursa(job #773886)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 2 august 2012 19:14:26
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#define dim 1010
#define inf 2000000000
int n, m , sum  , i,x,y,z,C[dim][dim],F[dim][dim],viz[dim],min,T[dim] ;

FILE*f=fopen("maxflow.in","r");
FILE*g=fopen("maxflow.out","w");

struct nod{
	int v;
	nod *adr;
}*L[dim],*p,*c;

void read(){
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d%d",&x,&y,&z);
		p=new nod;
		p->v=y;
		p->adr=L[x];
		L[x]=p;
		p=new nod;
		p->v=x;
		p->adr=L[y];
		L[y]=p;
		C[x][y]=z;
	}
}

int bfs(){
	for(i=1;i<=n;i++)
		viz[i]=0;
	int D[2*dim];
	int p=1,u=1,ok=0;
	D[1]=1;viz[1]=1;
	while(p<=u){
		x=D[p];
		c=L[x];
		while(c){
			if(!viz[c->v]&&(C[x][c->v]>F[x][c->v])){
				D[++u]=c->v;
				viz[c->v]=1;
				T[c->v]=x;
				if(c->v==n)
					ok=1;
			}
			c=c->adr;
		}
		p++;
	}
	return ok;
}

int main(){
	read();
	
	while(bfs()){
		c=L[n];
		while(c){
			if(viz[c->v] && (C[c->v][n]>F[c->v][n])){
				T[n]=c->v;
				z=n;min=inf;
				while(T[z]){
					if( (C[T[z]][z]-F[T[z]][z])<min)
						min=C[T[z]][z]-F[T[z]][z];
					z=T[z];
				}
				z=n;
				while(T[z]){
					F[T[z]][z]+=min;
					F[z][T[z]]-=min;
					z=T[z];
				}
			}
			c=c->adr;
		}
	}
	
	c=L[1];
	while(c){
		sum+=F[1][c->v];
		c=c->adr;
	}
	
	fprintf(g,"%d",sum);
	
	return 0;
}