Cod sursa(job #676475)

Utilizator milijrCristian Militaru milijr Data 9 februarie 2012 09:50:56
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
#define MAXN 1005
class muchie
{
public:
	muchie(): dest(0), cap(0), flux(0), indice(0){};
	muchie(int destS, int capS, int fluxS, int indiceS):
		dest(destS),
		cap(capS),
		flux(fluxS),
		indice(indiceS)
	{}
	int dest, cap, flux, indice;
	//indice e folosit doar daca cap < 0 si indica indicele lui THIS in graf[dest]
};
vector<muchie> muchii[MAXN];
typedef vector<muchie>::iterator iter;
pair<int, iter> parinte[MAXN];
int n, m;
muchie muchieReala(muchie muc)
{
	return muchii[muc.dest][muc.indice];
}
void dfs(int nod)
{
	if(nod == n)
	{
		int minDif = 110001,aux;
		muchie auxM;
		while(nod != 1)
		{
			if(parinte[nod].first >= 0)
			{
				auxM = *(parinte[nod].second);
				aux  = auxM.cap - auxM.flux;
				nod  = parinte[nod].first;
			}
			else
			{
				auxM = muchieReala(*(parinte[nod].second));
				aux  = auxM.flux;
				nod  = -parinte[nod].first;
			}
			if(aux < minDif)
				minDif =aux;
		}
		nod = n;
		while(nod != 1)
		{
			if(parinte[nod].first >= 0)
			{
				(*(parinte[nod].second)).flux += minDif;
				nod = parinte[nod].first;
			}
			else
			{
				(muchieReala(*(parinte[nod].second))).flux -= minDif;
				nod = -parinte[nod].first;
			}	
		}
		return;
	}
	iter it;
	for(it = muchii[nod].begin(); it != muchii[nod].end(); it++)
	{
		if(parinte[(*it).dest].first)
		{
			continue;
		}
		if((*it).cap < 0)
		{
			if(muchieReala(*it).flux != 0)
			{
				parinte[(*it).dest].first = -nod;
				parinte[(*it).dest].second= it;
				dfs((*it).dest);
				parinte[(*it).dest].first = 0;
			}
		}
		else
		{
			if((*it).flux != (*it).cap)
			{
				parinte[(*it).dest].first = nod;
				parinte[(*it).dest].second= it;
				dfs((*it).dest);
				parinte[(*it).dest].first = 0;
			}
		}
	}
}
int main()
{
	FILE *in = fopen("maxflow.in", "r");
	FILE *out= fopen("maxflow.out","w");
	fscanf(in, "%i %i", &n, &m);
	int i, nod1, nod2, capacitate;
	for(i = 1; i <= m; i++)
	{
		fscanf(in, "%i %i %i", &nod1, &nod2, &capacitate);
		muchii[nod1].push_back(muchie(nod2, capacitate, 0, 0));
		muchii[nod2].push_back(muchie(nod1, -capacitate,0, muchii[nod1].size() - 1));
	}
	int fluxMax = 0;
	parinte[1].first = -1;
	dfs(1);
	iter it;
	for(it = muchii[1].begin(); it != muchii[1].end(); it++)
	{
		fluxMax += (*it).flux;
	}
	fprintf(out,"%i", fluxMax);
}