Cod sursa(job #2454553)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 9 septembrie 2019 00:15:56
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

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

struct Edge {
	int v, cap, next; };

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

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

	fill(begin(dist), end(dist), -1);
	at = adj;

	dq.push_back(src);
	dist[src] = 0;	

	while (!dq.empty()) {
		u = dq.front();
		dq.pop_front();

		for (; at[u] != -1; at[u] = edgs[at[u]].next) {
			int v = edgs[at[u]].v;
			if (dist[v] != -1 || edgs[at[u]].cap == 0)
				continue;
			dist[v] = dist[u] + 1;
			dq.push_back(v); } }

	return dist[snk] != -1; }

static int dfs(int u, int bnd = 2e9) {
	if (u == snk)
		return bnd;

	int flw = 0;
	for (; at[u] != -1 && bnd > 0; at[u] = edgs[at[u]].next) {
		int augm, e = at[u], v = edgs[at[u]].v;
		if (edgs[at[u]].cap > 0 && dist[v] == dist[u] + 1 && (augm = dfs(v, min(bnd, edgs[at[u]].cap))) > 0) {
			augm = min(augm, bnd);

			edgs[at[u]].cap-= augm;
			edgs[at[u] ^ 1].cap+= augm;

			flw+= augm;
			bnd-= augm; } }

	return flw; }

static int get_flow() {
	int t, ant = 0;
	while (bfs()) {
		at = adj;
		while (t = dfs(src))
			ant+= t; }
	return ant; }

int main() {
	fi >> n >> m;
	src = 1, snk = n;
	adj = at = dist = vector<int>(n + 1, -1);
	for (int u, v, c, i = 0; i < m; ++i) {
		fi >> u >> v >> c;
		edgs.push_back({v, c, adj[u]});
		adj[u] = edgs.size() - 1;
		edgs.push_back({u, 0, adj[v]});
		adj[v] = edgs.size() - 1; }

	fo << get_flow() << endl;

	return 0; }