Cod sursa(job #1228333)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 13 septembrie 2014 19:27:16
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <queue>
#include <vector>
#define DIM 1005
#define INF 2000000000
#define vint vector<int>::iterator
#define infile "maxflow.in"
#define outfile "maxflow.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

queue<int> Q;

vector<int> L[DIM];

int F[DIM][DIM], C[DIM][DIM], T[DIM];

int n, m, a, b, c;

bool ok[DIM];

bool BFS() {
	for (int i = 1; i <= n; ++i)
		ok[i] = 0;
	Q.push(1);
	ok[1] = 1;
	while (!Q.empty()) {
		int nod = Q.front();
		Q.pop();
		if (nod == n)
			continue;
		for (vint it = L[nod].begin(); it != L[nod].end(); ++it)
		if (!ok[*it] && C[nod][*it] > F[nod][*it]) {
			ok[*it] = 1;
			T[*it] = nod;
			Q.push(*it);
		}
	}
	return ok[n];
}

int main() {
	f >> n >> m;
	for (int i = 1; i <= m; ++i) {
		f >> a >> b >> c;
		L[a].push_back(b);
		L[b].push_back(a);
		C[a][b] = c;
	}
	int flow = 0;
	while (BFS()) {
		for (vint it = L[n].begin(); it != L[n].end(); ++it)
		if (C[*it][n] > F[*it][n]) {
			T[n] = *it;
			int Min = INF;
			for (int i = n; i != 1; i = T[i])
				Min = (Min > C[T[i]][i] - F[T[i]][i] ? C[T[i]][i] - F[T[i]][i] : Min);
			if (Min == 0)
				continue;
			for (int i = n; i != 1; i = T[i]) {
				F[T[i]][i] += Min;
				F[i][T[i]] -= Min;
			}
			flow += Min;
		}
	}
	g << flow;
	return 0;
}

//This room. This bullet. There's a bullet for everyone. And a time. And a place. Yes... maybe this is how it has to be. - 47