Cod sursa(job #3311843)

Utilizator matei0000Neacsu Matei matei0000 Data 24 septembrie 2025 16:35:53
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

const int inf = 1e9;

struct Dinic {
	int n;
	vector<int> last, clast, dist;
	struct Edge {
		int from, to, cap, prev;
	};
	vector<Edge> edges;
	Dinic(int N) {
		n = N + 1;
		last.resize(n, -1);
	}
	void addEdge(int from, int to, int cap) {
		edges.push_back({from, to, cap, last[from]});
		last[from] = edges.size() - 1;
		edges.push_back({to, from, 0, last[to]});
		last[to] = edges.size() - 1;
	}
	
	bool bfs(int s, int d) {
		last = clast;
		dist.assign(n, inf);
		dist[s] = 0;
		queue<int> q;
		q.push(s);
		while (!q.empty()) {
			int x = q.front();
			q.pop();
			for (int i = last[x]; i != -1; i = edges[i].prev) {
				if (edges[i].cap == 0)
					continue;
				if (dist[edges[i].to] == inf) {
					dist[edges[i].to] = 1 + dist[x];
					q.push(edges[i].to);
				}
			}
		}
		return dist[d] < inf;
	}
	
	int dfs(int nod, int d, int push) {
		if (push == 0 || nod == d)
			return push;
		int real = 0;
		for (int i = last[nod]; i != -1; i = edges[i].prev) {
			last[nod] = i;
			if (edges[i].cap > 0 && dist[nod] + 1 == dist[edges[i].to]) {
				int x = dfs(edges[i].to, d, min(push, edges[i].cap));
				
				edges[i].cap -= x;
				edges[i ^ 1].cap += x;
				
				push -= x;
				real += x;
			}
			if (push == 0)
				break;
		}
		return real;
	}
	
	int maxFlow(int s, int d) {
		clast = last;
		int ans = 0;
		while (bfs(s, d)) {
			ans += dfs(s, d, inf); 
		}
		return ans;
	}
};

signed main() {
	ifstream cin("maxflow.in");
	ofstream cout("maxflow.out");
	int n, m;
	cin >> n >> m;
	Dinic g(m);
	for (int i = 0; i < m; i ++) {
		int x, y, z;
		cin >> x >> y >> z;
		g.addEdge(x, y, z);
	}
	cout << g.maxFlow(1, n) << '\n';
}