Cod sursa(job #1818676)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 29 noiembrie 2016 18:19:37
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;

void solve_flux();
int ask();
void update(int k);
bool bfs();

int S, D;
int adia[1100][1100];
int flux;
int tata[1100];



int main()
{
	ifstream in("maxflow.in");
	int n, m;
	in >> n >> m;
	S = 1, D = n;
	int a, b, c;

	while (m--) {
		in >> a >> b >> c;
		adia[a][b] += c;
	}

	solve_flux();

	ofstream out("maxflow.out");

	out << flux;

	return 0;
}


bool bfs()
{
	memset(tata, 0, sizeof tata);
	queue <int> q;
	q.push(S);
	tata[S] = -1;
	while (!q.empty()) {
		int n = q.front();
		q.pop();

		for (int i(1); i <= D; i++) {
			if (adia[n][i] && !tata[i]) {
				tata[i] = n, q.push(i);
				if (i == D)
					return true;
			}
		}
	}
	return false;
}


void update(int k)
{
	flux += k;
	for (int i(D); i != S; i = tata[i])
		adia[tata[i]][i] -= k, adia[i][tata[i]] += k;
}

int ask()
{
	int minim(1e9);
	for (int i(D); i != S; i = tata[i])
		minim = min(minim, adia[tata[i]][i]);
	return minim;
}

void solve_flux()
{
	while (bfs())
		update(ask());
}