Cod sursa(job #531303)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 9 februarie 2011 13:29:36
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
#include<vector>
#define NMAX 1001
#define sz [NMAX][NMAX]
#define INF 0x3f3f3f3f
using namespace std;
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
int N,M,cap sz,flux sz,tata[NMAX],viz[NMAX],c[NMAX];
vector <int> a[NMAX];

int bf(){
	memset(viz,0,sizeof(viz));
	int p=1,u=1;
	c[1]=1;
	viz[1]=1;
	while(p<=u){
	   int nod=c[p];
	   for(int i=0;i<a[nod].size();++i)
		   if(!viz[a[nod][i]] && cap[nod][a[nod][i]] > flux[nod][a[nod][i]])
		   {  viz[a[nod][i]]=1;
			  c[++u]=a[nod][i];
		      tata[a[nod][i]]=nod;
			  if(a[nod][i]==N)
				  return 1;
		   }
	p++;	
	}
return 0;	
}
int main(){
	fscanf(f,"%d%d",&N,&M);
	for(int i=1;i<=M;++i){
		int x,y,c;
		fscanf(f,"%d%d%d",&x,&y,&c);
		cap[x][y]+=c;
		a[x].push_back(y);
		a[y].push_back(x);		
	}
	int flow=0;
	while(bf()){
		int fmn=INF;
        for(int nod=N;nod!=1;nod=tata[nod])
			fmn=min(fmn, cap[tata[nod]][nod]-flux[tata[nod]][nod]);			
		for(int nod=N;nod!=1;nod=tata[nod])
		    flux[tata[nod]][nod]+=fmn,
			flux[nod][tata[nod]]-=fmn;
		flow+=fmn;		
	}
	fprintf(g,"%d",flow);
return 0;
}