Cod sursa(job #480213)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 26 august 2010 23:28:03
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <string>
#include <vector>

using namespace std;

#define NM 1005

//chestiile generale

vector<int> G[NM];

int Cap[NM][NM], Flux[NM][NM];

int N, M;

//chestiile pentru flux

int tata[NM], coada[NM];

bool viz[NM];

int unitati_flux;

int poti_pompa()
{	
	//parcurgere in latime
	
	memset (viz, false, sizeof(viz));
	
	int st = 0, dr = -1;
	
	coada[++dr] = 1;
	viz[1] = true;
	
	int se_poate_ajunge = 0;
	
	while (st <= dr)
	{
		int nod = coada[st];
		++st;
		
		if (nod == N)
		{
			se_poate_ajunge = 1;
			break;
		}	
		
		for (int i = 0; i < G[nod].size(); ++i)
		{
			int nnod = G[nod][i];
			
			if (viz[nnod]) continue;
			if ((Cap[nod][nnod] - Flux[nod][nnod]) <= 0) continue;
			
			coada[++dr] = nnod;
			viz[nnod] = true;
			tata[nnod] = nod;
		}	
	}	
	
	if (!se_poate_ajunge) return 0;
	
	// aflu cantitatea de pompat
	
	int nod = N, flux_supl = 1000000000;
	
	while (tata[nod])
	{
		flux_supl = min(flux_supl, Cap[tata[nod]][nod] - Flux[tata[nod]][nod]);
		
		nod = tata[nod];
	}	
	
	unitati_flux += flux_supl;
	
	// refac reteaua
	
	nod = N;
	
	while (tata[nod])
	{
		Flux[tata[nod]][nod] += flux_supl;
		Flux[nod][tata[nod]] -= flux_supl;
		
		nod = tata[nod];
	}	
	
	return 1;
}

int main()
{
	int a, b, c;
	
	freopen ("maxflow.in", "r", stdin);
	freopen ("maxflow.out", "w", stdout);
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= M; ++i)
	{
		scanf ("%d %d %d", &a, &b, &c);
		
		Cap[a][b] += c;
		
		G[a].push_back(b);
		G[b].push_back(a);
	}	
	
	while (poti_pompa());
	
	printf ("%d", unitati_flux);
	
	return 0;
}