Cod sursa(job #917913)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 18 martie 2013 14:18:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <string.h>
#include <iomanip>
using namespace std;


const string file = "maxflow";

const string infile = file + ".in";
const string outfile = file + ".out";


#define MAXN 1002
#define INF 1<<29

vector<int> G[MAXN];

int Rezidual[MAXN][MAXN];
int Flux[MAXN][MAXN];
int BfsParrent[MAXN];

bool viz[MAXN];

int FMax;
int N;
int M;



void citire()
{
	ifstream fin(infile.c_str());

	fin >> N >> M;

	for(int i = 0; i < M; i++)
	{
		int x, y, c;
		fin >> x >> y >> c;

		G[x].push_back(y);
		G[y].push_back(x);

		Rezidual[x][y] += c;
	}

	fin.close();
}

bool BFS()
{
	memset(BfsParrent, 0, sizeof(BfsParrent));
	memset(viz, 0, sizeof(viz));

	queue<int> q;
	q.push(1);

	viz[1] = true;

	while(q.empty() == false)
	{
		int current = q.front();
		q.pop();
		if(current == N)
			return true;

		for (vector<int>::iterator itr = G[current].begin();
			 itr != G[current].end();
			 itr++)
		{
			
			if(viz[*itr] == false && Flux[current][*itr] != Rezidual[current][*itr])
			{
				viz[*itr] = true;
				BfsParrent[*itr] = current;
				q.push(*itr);
			}
		}

	}

	return false;
}

void solve()
{
	while(BFS())
	{
		for (vector<int>::iterator itr = G[N].begin();
			 itr != G[N].end();
			 itr++)
		{
			int fmin = INF;
			
			if(BfsParrent[*itr] != 0)
			{
				BfsParrent[N] = *itr;
				for(int current = N; current != 1; current = BfsParrent[current])
				{
					fmin = min(fmin, Rezidual[BfsParrent[current]][current] - Flux[BfsParrent[current]][current]);
				}

				if(fmin != 0)
				{
					for(int current = N; current != 1; current = BfsParrent[current])
					{
						Flux[BfsParrent[current]][current] += fmin;
						Flux[current][BfsParrent[current]] -= fmin;
					}
					FMax += fmin;
				}

			}
		}
	}
}


void afisare()
{
	ofstream fout(outfile.c_str());

	fout << FMax << "\n";

	fout.close();
}

int main()
{

	citire();
	solve();
	afisare();
}