Cod sursa(job #676452)

Utilizator milijrCristian Militaru milijr Data 9 februarie 2012 08:40:24
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
using namespace std;
#define MAXN 1005
class muchie
{
	muchie(int destS, int capS, int fluxS): dest(destS), cap(capS), flux(fluxS){}
	int dest,cap,flux;
};
int mat[MAXN][MAXN];
int flux[MAXN][MAXN];
typedef vector<muchie>::iterator iter;
int parinte[MAXN];
int n, m;
void dfs(int nod)
{
	/*
	iter it;
	for(it = muchii[nod].begin(); it != muchii[nod].end(); it++)
	{
		if(parinte[(*it).dest])
		{
			continue;
		}
		if((*it).cap < 0)
		{
			if((*it).flux != 0)
			{
				parinte[*it] = -nod;
				parinte[*it] = 0;
			}
		}
		else
		{
		}
	}*/
	if(nod == n)
	{
		int minDif = 110001,aux;
		while(nod != 1)
		{
			if(parinte[nod] >= 0)
			{
				aux = mat[parinte[nod]][nod] - flux[parinte[nod]][nod];
				nod = parinte[nod];
			}
			else
			{
				aux = flux[nod][-parinte[nod]];
				nod = -parinte[nod];
			}
			if(aux < minDif)
				minDif =aux;
		}
		nod = n;
		while(nod != 1)
		{
			if(parinte[nod] >= 0)
			{
				flux[parinte[nod]][nod] += minDif;
				nod = parinte[nod];
			}
			else
			{
				flux[nod][-parinte[nod]] -= minDif;
				nod = -parinte[nod];
			}
		}
	}
	int i;
	for(i = 1; i <= n; i++)
	{
		if(parinte[i] != 0)
			continue;
		if(mat[nod][i] && flux[nod][i] != mat[nod][i])
		{
			parinte[i] = nod;
			dfs(i);
			parinte[i] = 0;
		}
		if(mat[i][nod] && flux[i][nod])
		{
			parinte[i] = -nod;
			dfs(i);
			parinte[i] = 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);
		mat[nod1][nod2] = capacitate;
	}
	int fluxMax = 0;
	dfs(1);
	for(i = 2; i <= n; i++)
	{
		fluxMax += flux[1][i];
	}
	fprintf(out,"%i", fluxMax);
}