Cod sursa(job #3234095)

Utilizator betybety bety bety Data 6 iunie 2024 12:14:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
using pii = pair<int, int>;
const int lim = 1e3 + 5;
const int inf = 1e9 + 7;
struct node {
	int id;
	int nod;
	int flow;
	int capp;
};
vector<node> vec[lim];
int n, m, x, y, c;
pii bef[lim];
bool ok[lim];
int main() {
	in >> n >> m;
	for (int i = 1; i <= m; ++i) {
		in >> x >> y >> c;
		int vxs = vec[x].size();
		int vys = vec[y].size();
		vec[x].push_back((node){vys, y, 0, c});
		vec[y].push_back((node){vxs, x, 0, 0});
	}
	int max_flow = 0;
	int added_flow;
	do {
		for (int i = 1; i <= n; ++i) {
			ok[i] = false;
			bef[i] = make_pair(-1, -1);
		}
		added_flow = 0;
		queue<int> q;
		q.push(1);
		ok[1] = true;
		while (!q.empty()) {
			int curr = q.front();
			q.pop();
			for (int i = 0; i < vec[curr].size(); ++i) {
				node x = vec[curr][i];
				if (ok[x.nod] or x.flow == x.capp) {
					continue;
				}
				ok[x.nod] = true;
				bef[x.nod] = make_pair(curr, i);
				q.push(x.nod);
			}
		}
		for (int i = 0; i < vec[n].size(); ++i) {
			node pen = vec[n][i];
			if (!(ok[pen.nod] and
				  vec[pen.nod][pen.id].flow < vec[pen.nod][pen.id].capp)) {
				continue;
			}
			int min_diff =
				vec[pen.nod][pen.id].capp - vec[pen.nod][pen.id].flow;
			for (int unde = pen.nod; unde != 1; unde = bef[unde].first) {
				min_diff = min(min_diff,
							   vec[bef[unde].first][bef[unde].second].capp -
								   vec[bef[unde].first][bef[unde].second].flow);
			}
			if (min_diff == 0) {
				continue;
			}
			vec[pen.nod][pen.id].flow += min_diff;
			vec[n][i].flow -= min_diff;
			for (int unde = pen.nod; unde != 1; unde = bef[unde].first) {
				vec[bef[unde].first][bef[unde].second].flow += min_diff;
				vec[unde][vec[bef[unde].first][bef[unde].second].id].flow -=
					min_diff;
			}
			added_flow += min_diff;
		}
		max_flow += added_flow;
	} while (added_flow != 0);
	out << max_flow << '\n';
	return 0;
}