Cod sursa(job #571449)

Utilizator avram_florinavram florin constantin avram_florin Data 4 aprilie 2011 14:26:12
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<cstdio>
#include<vector>
#include<queue>

#define minim(a, b) ((a)<=(b)?(a):(b))
#define InFile "maxflow.in"
#define OutFile "maxflow.out"

using namespace std;

const int MaxN = 1001;
const int INF = 0x3f3f3f3f;

int n,m,viz[MaxN],C[MaxN][MaxN],F[MaxN][MaxN],T[MaxN];
vector<int> G[MaxN];
queue<int> Q;

int BFS( int Sursa , int Destinatie )
{
	int nod;
	memset(viz,0,sizeof(viz));
	Q.push(Sursa);
	viz[Sursa] = true;
	while( !Q.empty() )
		{
			nod = Q.front();
			Q.pop();
			if( nod == Destinatie )
				continue;
			vector<int>::iterator it;
			for( it = G[nod].begin() ; it != G[nod].end() ; ++it )
				if( !viz[*it] && C[nod][*it] > F[nod][*it] )
					{
						Q.push(*it);
						T[*it] = nod;
						viz[*it] = true;
					}
		}
	return viz[Destinatie];
}

int main()
{
	freopen( InFile , "r" , stdin );
	scanf("%d%d" , &n , &m );
	int i,x,y,c;
	for( i = 0 ; i < m ; i++ )
		{
			scanf("%d%d%d" , &x , &y , &c );
			C[x][y] = c;
			G[x].push_back(y);
			G[y].push_back(x);
		}
	int flux = 0;
	while( BFS(1,n) )
		{
			vector<int>::iterator it;
			int nod,min1;
			for( it = G[n].begin() ; it != G[n].end() ; ++it )
				{
					if( T[*it] && C[*it][n] > F[*it][n] )
						{
							T[n] = *it;
							min1 = INF;
							nod = n;
							while( nod != 1 )
								{
									min1 = minim(min1 , C[T[nod]][nod] - F[T[nod]][nod]);
									nod = T[nod];
								}
							nod = n;
							while( nod != 1 )
								{
									F[T[nod]][nod] += min1;
									F[nod][T[nod]] -= min1;
									nod = T[nod];
								}
							flux += min1 ;
						}
				}
		}
	freopen( OutFile , "w" , stdout );
	printf("%d\n" , flux );
	return 0;
}