Cod sursa(job #2884345)

Utilizator apocal1ps13Stefan Oprea Antoniu apocal1ps13 Data 2 aprilie 2022 22:09:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<bitset>
#include<vector>
#include<fstream>
#include<queue>
#define NMAX 1001
const int INF = 2e9;
std::ifstream in("maxflow.in");
std::ofstream out("maxflow.out");
std::vector<int>viz, d, g[NMAX];
int n, m;
long long a[NMAX][NMAX];
using namespace std;
void add_edge(int x, int y, int c) {
	a[x][y] = c;
	g[x].push_back(y);
	g[y].push_back(x);
}
inline bool bfs(int const& source = 1, int const& sink = n) {
	viz = vector<int>(n + 1);
	queue<int>coada;
	viz[source] = 1;
	d[source] = 1;
	coada.push(source);
	while (!coada.empty()) {
		int node = coada.front();
		coada.pop();
		if (node == sink) continue;
		for (auto i : g[node]) {
			if (!viz[i] && a[node][i]) {
				viz[i] = 1;
				d[i] = node;
				coada.push(i);
			}
		}
	}
	return viz[sink];
}
long long maxflow(const int& source = 1, const int& sink = n) {
	long long maxi = 0;
	while (bfs()) {
		for (auto node : g[sink]) {
			if (a[node][sink] < 1 || !viz[node]) continue;
			d[sink] = node;
			long long flow = INF;
			for (int i = sink; i != source; i = d[i])
				flow = min(flow, a[d[i]][i]);
			if (flow < 1) continue;
			for (int i = sink; i != source; i = d[i]) {
				a[d[i]][i] -= flow;
				a[i][d[i]] += flow;
			}
			maxi += flow;
		}
	}
	return maxi;
}
int main() {
	in >> n >> m;
	d = vector<int>(n + 1);
	int x, y, c;
	for (int i = 0; i < m; i++) {
		in >> x >> y >> c;
		add_edge(x, y, c);
	}
	out << maxflow();
	return 0;
}