Cod sursa(job #286088)

Utilizator katakunaCazacu Alexandru katakuna Data 23 martie 2009 14:02:00
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
using namespace std;
#include <cstdio>
#include <list>
#include <algorithm>

#define Nmax 1010

list <int> L[Nmax];
int C[Nmax][Nmax], F[Nmax][Nmax], c[Nmax], t[Nmax];
int n, m, i, maxflow;

void citire(){

	int i, x, y, z;
	FILE *f = fopen("maxflow.in", "r");

	fscanf(f,"%d %d",&n,&m);
	for(i=1; i <= m; i++){
		fscanf(f,"%d %d %d",&x, &y, &z);
		L[x].push_back(y);
		L[y].push_back(x);
		C[x][y] = z; // C[y][x] = 0;
	}
	
	fclose(f);
}


int BF(){

	int p = 1, u = 1, ok = 0, fiu, nod;
	list <int>::iterator it;
	memset(t, 0, sizeof(t));
	
	c[1] = 1; t[1] = 0;
	
	for(p = 1; p <= u; p++){
		nod = c[p];
		for(it = L[nod].begin(); it != L[nod].end(); it++){
			fiu = *it;
			
			if( F[nod][fiu] < C[nod][fiu] && !t[fiu]){
				if( fiu == n ) {ok = 1; continue;}
				u++;
				c[u] = fiu;
				t[fiu] = nod;
			}			
		}		
	}
	
    return ok;
}


void solve(){

	list <int>::iterator it; int T, Min, fiu;
	
	while( BF() ){
		for(it = L[n].begin(); it !=L[n].end(); it++){
			fiu = *it;
			if( t[fiu] ){
				Min = C[fiu][n] - F[fiu][n];
				for(T = fiu; T != 1 ;  T = t[T])
					Min = min(Min, C[ t[T] ][ T ] - F[ t[T] ][ T ]);
				
				F[fiu][ n ]+= Min;
				F[ n ][fiu]-= Min;
				
				for(T = fiu; T != 1 ;  T = t[T]){
					F[t[T]][ T ]+= Min;
					F[ T ][t[T]]-= Min;
				}
				
				maxflow+=Min;
			}			
		}		
	}

}

void afisare(){

	FILE *g = fopen("maxflow.out", "w");
	fprintf(g,"%d",maxflow);
	fclose(g);
}

int main(){

	citire();
	solve();
	afisare();

	return 0;

}