Cod sursa(job #942322)

Utilizator tudorv96Tudor Varan tudorv96 Data 21 aprilie 2013 20:30:04
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;

#define in "maxflow.in"
#define out "maxflow.out"
#define N 1005
#define INF 1 << 30

queue <int> Q;
int F[N][N], C[N][N], n, m, S, D;
vector <int> d (N, 0);

void DetSource ()
{ 
	for (int i = 1; i <= n && !D; ++i) {
		int k = 0;
		for (int j = 1; j <= n; ++j)
			k += (i != j && C[i][j]) ? 1 : 0;
		D = !k ? i : 0;
	}
	for (int j = 1 ; j <= n && !S; ++j) {
		int k = 0;
		for (int i = 1; i <= n; ++i)
			k += (i != j && C[i][j]) ? 1 : 0;
		S = !k ? j : 0;
	}
}

bool BFS ()
{
	while (Q.size())
		Q.pop();
	Q.push (S);
	d[S] = -1;
	while (Q.size() && !d[D]) {
		int x = Q.front();
		for (int i = 1; i <= n; ++i)
			if (!d[i]) {
				if (F[x][i] < C[x][i]) {
					d[i] = x;
					Q.push (i);
				}
				else
					if (F[i][x] > 0) {
						d[i] = -x;
						Q.push (i);
					}
			}
		Q.pop();
	}
	return !d[D];
}

int main ()
{
	ifstream fin (in);
	fin >> n >> m;
	for (int i = 0; i < m; ++i) {
		int x, y, c;
		fin >> x >> y >> c;
		C[x][y] = c;
	}
	fin.close();
	DetSource ();
	vector <int> L;
	do {
		L.resize (0);
		for (int i = 1; i <= n; ++i)
			d[i] = 0;
		if (BFS())
			break;
		L.push_back (D);
		int a = INF, b = INF;
		while (L[L.size()-1] != S) {
			L.push_back (d[L.back()]);
			if (d[L[L.size()-2]] > 0)
				a = min (a, C[L.back()][L[L.size()-2]] - F[L.back()][L[L.size()-2]]);
			else
				b = min (b, F[L[L.size()-2]][L.back()]);
		}
		int v = min (a, b);
		for (int i = L.size() - 1; i >= 0; --i)
			if (L[i-1] > 0)
				F[L[i]][L[i-1]] += v;
			else
				F[L[i-1]][L[i]] -= v;
	} while (1);
	ofstream fout (out);
	int flux = 0;
	for (int i = 1; i <= n; ++i) 
		flux += F[i][D];
	fout << flux;
	fout.close();
	return 0;
}