Cod sursa(job #2082826)

Utilizator ice_creamIce Cream ice_cream Data 6 decembrie 2017 20:17:03
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f ("maxflow.in");
ofstream g ("maxflow.out");

const int INF = (1 << 30);
const int NMAX = 1000;

int n;

bool vizitat[NMAX + 1];
int from[NMAX + 1];
int capacitate[NMAX + 1][NMAX + 1];
int flux[NMAX + 1][NMAX + 1];

vector <int> graf[NMAX + 1];

void citeste() {
	int m, a, b, c;

	f >> n >> m;
	for (int i = 1; i <= m; i++) {
		f >> a >> b >> c;

		graf[a].push_back(b);
		graf[b].push_back(a);

		capacitate[a][b] += c;
	}
}

bool BFS(int sursa, int destinatie) {
	queue <int> q;
	for (int i = 1; i <= n; i++) vizitat[i] = false;

	q.push(sursa);
	vizitat[sursa] = false;

	while (!q.empty()) {
		int nod = q.front();
		q.pop();

		if (nod == destinatie) break;

		int l = graf[nod].size();
		for (int i = 0; i < l; i++) {
			int fiu = graf[nod][i];
			if (vizitat[fiu]) continue;
			if (flux[nod][fiu] >= capacitate[nod][fiu]) continue;
			vizitat[fiu] = true;
			q.push(fiu);
			from[fiu] = nod;
		}
	}

	return vizitat[destinatie];
}

void rezolva(int sursa, int destinatie) {
	int sol = 0;
	while (BFS(sursa, destinatie)) {
		int nr_fii = graf[destinatie].size();

		for (int i = 0; i < nr_fii; i++) {
			int nod = graf[destinatie][i];
			if (!vizitat[nod]) continue;

			from[destinatie] = nod;
			nod = destinatie;
			int minim = INF;

			int ant;

			while (nod != sursa) {
				ant = from[nod];
				minim = min(minim, capacitate[ant][nod] - flux[ant][nod]);
				nod = ant;
			}

			nod = destinatie;
			while (nod != sursa) {
				ant = from[nod];
				flux[ant][nod] += minim;
				flux[nod][ant] -= minim;
				nod = ant;
			}

			sol += minim;
		}
	}

	g << sol << '\n';
}

int main() {
	citeste();
	rezolva(1, n);
	return 0;
}