Cod sursa(job #1262827)

Utilizator HotSteelBeteag Ion Andrei HotSteel Data 13 noiembrie 2014 16:25:10
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <cstring>

#include <algorithm>

#include <vector>
#include <queue>

using namespace std;

#define MaxVertex 1005

int V,E;
int Capacity[MaxVertex][MaxVertex];
int Flow[MaxVertex][MaxVertex];

vector < vector < int > > AdcMatrix;

bool Visited[MaxVertex];
int Father[MaxVertex];

bool BFS()
{
	memset(Visited, false, sizeof(Visited));
	memset(Father, 0, sizeof(Father));

	static queue < int > Q;
	Q.push(1);
	Visited[1] = true;

	static int Vertex;

	static vector < int > :: iterator it;

	while(!Q.empty())
	{
		Vertex = Q.front();
		Q.pop();

		for(it = AdcMatrix[Vertex].begin() ; it != AdcMatrix[Vertex].end() ; ++it)
		{
			if(!Visited[*it] && Capacity[Vertex][*it] > Flow[Vertex][*it])
			{
				Father[*it] = Vertex;
				Visited[*it] = true;

				if(*it != V)
					Q.push(*it);
			}
		}
	}

	return Visited[V];
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

	scanf("%d%d", &V, &E);

	int i;
	for(i = 0 ; i <=  V ; ++i)
		AdcMatrix.push_back( vector < int > () );

	int VA,VB;

	for(i = 1 ; i <= E ; ++i)
	{
		scanf("%d%d", &VA, &VB);
		scanf("%d", &Capacity[VA][VB]);

		AdcMatrix[VA].push_back(VB);
		AdcMatrix[VB].push_back(VA);
	}

	int MinFlow;

	int MaxFlow = 0;

	vector < int > :: iterator it;

	while(BFS())
	{
		for(it = AdcMatrix[V].begin() ; it != AdcMatrix[V].end() ; ++it)
		{
			if(!Visited[*it])
				continue;

			Father[V] = *it;
			MinFlow = (1 << 31) - 1;

			i = V;
			while(i != 1)
			{
				MinFlow = min(MinFlow, Capacity[Father[i]][i] - Flow[Father[i]][i]);

				i = Father[i];
			}

			i = V;
			while(i != 1)
			{
				Flow[Father[i]][i] += MinFlow;
				Flow[i][Father[i]] -= MinFlow;

				i = Father[i];
			}

			MaxFlow += MinFlow;
		}
	}

	printf("%d", MaxFlow);

    return 0;
}