Cod sursa(job #3227090)

Utilizator moldovan_robert_lolMoldovan Robert moldovan_robert_lol Data 25 aprilie 2024 12:26:16
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>

std::ifstream fin("maxflow.in");
std::ofstream fout("maxflow.out");

int gs, edg;
std::vector<std::vector<int>> adj_list;
int cap[1001][1001];

int edmonds_karp() {
	int ret = 0;
	while (1) {
		std::queue<int> q;
		std::vector<int> last(gs+1,0);
		std::vector<int> min(gs+1,0x3f3f3f3f);
		std::vector<bool> vis(gs+1,0);
		q.emplace(1);
		vis[1] = 1;

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

			for (const auto& i : adj_list[k]) {
				if (!vis[i]&&cap[k][i]>0) {
					vis[i] = 1;
					last[i] = k;
					min[i] = std::min(min[k],cap[k][i]);
					q.emplace(i);
				}
			}
		}

		if (!vis[gs]) {
			break;
		}

		int add = min[gs];
		ret += add;
		int k = gs;
		while (last[k]) {
			cap[last[k]][k] -= add;
			cap[k][last[k]] += add;
			k = last[k];
		}
	}

	return ret;
}

int main() {
	fin >> gs >> edg;
	adj_list.resize(gs+1);

	for (int i = 0, a, b, c; i < edg; i++) {
		fin >> a >> b >> c;
		adj_list[a].emplace_back(b);
		adj_list[b].emplace_back(a);
		cap[a][b] = c;
	}

	fout << edmonds_karp() << "\n";
}