Cod sursa(job #444666)

Utilizator lalasCont de teste lalas Data 21 aprilie 2010 10:15:55
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
using namespace std;
const int maxn = 1005;
const int INF = 10000005;

int i , n , m , a , b , c;
int C[maxn][maxn] , F[maxn][maxn] , dad[maxn];
bool seen[maxn];
vector <int> G[maxn];
queue <int> Q;

bool BF ()
{	
	while (!Q.empty()) Q.pop();
	Q.push(1);
	memset ( seen , 0 , sizeof(seen));
	seen[1] = true;
	
	for( ; !Q.empty() ; ) {
		int node = Q.front() , i;
		Q.pop();
		if ( node == n ) break;
		for( i = 0 ; i < G[node].size() ; ++i ) {
			int act = G[node][i];
			if ( seen[act] == 0 && F[node][act] < C[node][act] ) {
				Q.push(act);
				seen[act] = 1;
				dad[act] = node;
			}
		}
	}
	
return seen[n];
}
				

int flow()
{
	int result = 0;
	
	while ( BF() ) {
		int i;
		for( i = 0 ; i < G[n].size() ; ++i ) {
			int act = G[n][i];
			
			if ( F[act][n] == C[act][n] || ! seen[act] ) continue ;
			
			dad[n] = act;
			int minflow = INF;
			
			for( act = n ; act != 1 ; act = dad[act] ) 
				minflow = min ( minflow , ( C[dad[act]][act] - F[dad[act]][act] ));
			
			if ( minflow == 0 ) continue ;
			
			for( act = n ; act != 1 ; act = dad[act] ) {
				F[dad[act]][act] += minflow;
				F[act][dad[act]] -= minflow;
			}
			
			result += minflow;
		}
	}
	return result;
}
int main()
{
	freopen("maxflow.in","r",stdin);
	freopen("maxflow.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for( i = 1 ; i <= m ; ++i ) {
		scanf("%d %d %d",&a,&b,&c);
		G[a].pb(b);
		G[b].pb(a);
		C[a][b] += c;
	}
	
	printf("%d\n",flow());

return 0;
}