Cod sursa(job #2292596)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 29 noiembrie 2018 18:55:02
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fi("maxflow.in");
ofstream fo("maxflow.out");

class Dinic {
	struct Edge {
		int cap, to, next; };

	vector<Edge> edges;
	vector<int> adj, at, dist;
	int n, src, snk;

public:	
	void add_edge(int u, int v, int cap) {
		edges.push_back({cap, v, adj[u]});
		adj[u] = edges.size() - 1;
		edges.push_back({cap, u, adj[v]});
		adj[v] = edges.size() - 1; }

	bool bfs() {
		deque<int> dq;
		int u;

		fill(begin(dist), end(dist), 0);
		dq.push_back(src);
		dist[src] = 1;
		while (!dq.empty()) {
			u = dq.front();
			dq.pop_front();

			for (int link = adj[u]; link != -1; link = edges[link].next) {
				Edge &edge = edges[link];
				if (!dist[edge.to] && edge.cap > 0) {
					dist[edge.to] = dist[u] + 1;
					dq.push_back(edge.to); } } }

		return dist[snk]; }

	int dfs(int u, int flw = 1e9) {
		if (u == snk)
			return flw;

		int augm;
		for (int link = at[u]; link != -1; link = edges[link].next) {
			Edge &e = edges[link];
			if (e.cap > 0 && dist[u] + 1 == dist[e.to] && (augm = dfs(e.to, min(e.cap, flw))) > 0) {
				edges[link ^ 1].cap+= augm;
				edges[link].cap-= augm;
				return augm; }
			at[u] = edges[link].next; }

		return 0; }

	int get_flow(int _src, int _snk) {
		int ant = 0, add;
		src = _src, snk = _snk;
		while (bfs()) {
			at = adj;
			while (add = dfs(src))
				ant+= add; }
		return ant; }

	Dinic(int _n) {
		n = _n + 1;
		dist = adj = at = vector<int>(n + 1, -1); } };

Dinic *myflow;
int n, m;

int main() {
	fi >> n >> m;
	myflow = new Dinic(n);
	for (int u, v, c, i = 0; i < m; ++i) {
		fi >> u >> v >> c;
		myflow->add_edge(u, v, c); }
	fo << myflow->get_flow(1, n) << endl;

	return 0; }