Cod sursa(job #718942)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 21 martie 2012 11:29:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<stdio.h>
#include<vector>

#define maxn 1005
#define pb push_back
#define S 1
#define D n
#define INF (1<<29)

using namespace std;

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

int n,m;
int Cp[maxn][maxn],F[maxn][maxn];
int C[maxn],T[maxn],viz[maxn];
vector<int>G[maxn];

inline void citire () {
	
	fscanf(f,"%d %d",&n,&m);
	
	int x,y,c;
	for ( int i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d %d",&x,&y,&c);
		G[x].pb(y);
		G[y].pb(x);
		Cp[x][y] = c;
	}
}

inline bool bfs () {
	int nod,nodvcn,found = 0;
	
	for ( int i = 1 ; i <= n ; ++i ){
		viz[i] = 0;
	}
	int p = 1,u = 0;
	C[++u] = S; viz[S] = 1;
	
	while ( p <= u ){
		nod = C[p];
		
		for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
			nodvcn = (*itt);
			
			if ( !viz[nodvcn] && Cp[nod][nodvcn] > F[nod][nodvcn] ){
				
				if ( nodvcn == D ){
					found = 1; continue ;
				}
				
				C[++u] = nodvcn; viz[nodvcn] = 1;
				T[nodvcn] = nod;
			}
		}
		
		++p;
	}
	
	return found;
}

inline int maxflow () {
	int flux = 0,nod,nodvcn,minim;
	
	while ( bfs() ){
		
		for ( vector<int>::iterator itt = G[D].begin() ; itt != G[D].end() ; ++itt ){
			nodvcn = (*itt); T[D] = nodvcn;
			
			minim = INF;
			for ( nod = D ; T[nod] ; nod = T[nod] ){
				minim = min(minim,Cp[T[nod]][nod]-F[T[nod]][nod]);
			}
			for ( nod = D ; T[nod] ; nod = T[nod] ){
				F[T[nod]][nod] += minim;
				F[nod][T[nod]] -= minim;
			}
			
			flux += minim;
		}
	}
	
	return flux;
}

int main () {
	
	citire();
	fprintf(g,"%d\n",maxflow());
	
	fclose(f);
	fclose(g);
	
	return 0;
}