Cod sursa(job #475703)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 8 august 2010 01:53:56
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1025

using namespace std;

const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";

ifstream fin(iname);
ofstream fout(oname);

vector<int> nod[nmax];
queue<int> Q;
int N, M, i, a, b, c, Cap[nmax][nmax], x, F[nmax][nmax], fmin, flow, y, tata[nmax], viz[nmax];


int BFS()
{
	Q.push(1);
	memset(viz, 0, sizeof(viz));
	while(!Q.empty())
	{
		x = Q.front();
		Q.pop();
		if(x == N)
			continue;
		for(vector<int>::iterator it = nod[x].begin(); it != nod[x].end(); ++it) //merg si adaug vecinii 
		{
			if(F[x][*it] == Cap[x][*it] || viz[*it]) //nu adaug daca nu pot ajunitge la un maxim sau l-am vizitat deja
				continue;
			Q.push(*it);
			viz[*it] = 1;
			tata[*it] = x;
		}
	}
	return viz[N]; //ajung la destinatie sau nu ?
}
		
int main()
{
	fin >> N >> M;
	for(i = 1; i <= M; i ++)
	{
		fin >> a >> b >> c;
		nod[a].push_back(b);
		nod[b].push_back(a);
		Cap[a][b] = c;
	}
	for(flow = 0; BFS();)
	{	
		//merg prin toti vecinii destinatiei si maresc fluxul cu ajutorul tuturor vecinilor frunza ai nodului N (creati in arborele meu BFS)
		for(vector<int>::iterator it = nod[N].begin(); it != nod[N].end(); ++ it)
		{
			if(F[*it][N] == Cap[*it][N] || !viz[*it]) //daca e maxim deja sau nu e vizitat sar peste el (nu ma conduce la drum sau nu mai am ce modifica)
				continue;
			tata[N] = *it; //altfel continui pe tati sa refac drumul pt a adauga fluxul bun
			fmin = 287185781;
			for(y = N; y != 1; y = tata[y])
				fmin = min(fmin, Cap[tata[y]][y] - F[tata[y]][y]); //minimul dintre diferenta capacitatii si flux = ce pot adauga pt drumul asta
			for(y = N; y != 1; y = tata[y])
			{
				F[tata[y]][y] += fmin; //adaug pe normala
				F[y][tata[y]] -= fmin; //scad pe inversa ca sa pot eventual veni pe un drum invers
			}
			flow += fmin; //adaug fmin (valoarea noua pe care o pot adauga la flux)
		} 
	}
	fout << flow;
	return 0;
}