Cod sursa(job #729640)

Utilizator rares192Preda Rares Mihai rares192 Data 29 martie 2012 19:37:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;

ofstream fout("maxflow.out");

#define NMAX 1024
#define INF 0x3f3f3f3f

vector<int> a[NMAX];
int n, m, F[NMAX][NMAX], C[NMAX][NMAX];
int tata[NMAX];
int fluxmin, flux;
queue<int> Q;

bool Bfs()
{
	memset(tata, 0, sizeof(tata));
	Q.push(1);
	tata[1] = 1;
	
	while( !Q.empty() )
	{
		int x = Q.front();
		Q.pop();
		for( int i = 0; i < (int)a[x].size(); ++i)
			if( !tata[ a[x][i] ] && F[x][ a[x][i] ] != C[x][ a[x][i] ] )
			{
				tata[ a[x][i] ] = x;
				if( a[x][i] != n)
					Q.push( a[x][i]);
			}
	}
	return tata[n];
}

void Read()
{
	ifstream fin("maxflow.in");
	fin >> n >> m;
	
	int x, y, z;
	for(int i = 1; i <= m; ++i)
	{
		fin >> x >> y >> z;
		C[x][y] = z;
		a[x].push_back(y);
		a[y].push_back(x);
	}
	fin.close();
}

void Flux()
{
	while( Bfs() )
	{
		for(int x = 0; x < (int)a[n].size(); ++x)
			if( tata[ a[n][x] ] && C[ a[n][x] ][n] != F[ a[n][x]][n])
			{
				tata[n] = a[n][x];
				fluxmin = INF;
				for(int i = n; i != 1; i= tata[i] )
					if( C[ tata[i] ][i] - F[ tata[i] ][i] < fluxmin)
						fluxmin = C[ tata[i] ][i] - F[ tata[i] ][i];
				
				if( fluxmin <= 0 ) 
					continue;
				
				for(int i = n; i != 1; i = tata[i] )
				{
					F[ tata[i]][i]  += fluxmin;
					F[i][ tata[i] ] -= fluxmin;
				}
				flux += fluxmin;
			}
			
	}
}
	

int main()
{
	Read();
	Flux();
	fout << flux << '\n';
	return 0;
}