Cod sursa(job #1262799)

Utilizator HotSteelBeteag Ion Andrei HotSteel Data 13 noiembrie 2014 16:04:48
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 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;

int Father[MaxVertex];

bool BFS()
{
	static bool Visited[MaxVertex];
	memset(Visited, false, sizeof(Visited));

	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;
				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;

	while(BFS())
	{
		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;
}