Cod sursa(job #2028208)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 27 septembrie 2017 13:11:08
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<(x)<<'\n'
#define dbg_v(x, n) {cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n';}
#define all(v) v.begin(), v.end()
#define INF 2000000010
#define ST_SIZE 1048600
#define NMAX 5010
#define MMAX 5010
#define VMAX 10010

struct edge
{
	int u, flow, rev;
	
	edge(int _u = 0, int _flow = 0, int _rev = 0) : u(_u), flow(_flow), rev(_rev) {}
};

int n, m, source, sink;
int d[NMAX], ptr[NMAX];
vector<edge> adj[VMAX];
queue<int> Q;

void addEdge(int a, int b, int flow)
{
	adj[a].emplace_back(b, flow, adj[b].size());
	adj[b].emplace_back(a, flow, adj[a].size() - 1);
}

bool bfs()
{
	memset(d, -1, sizeof d);
	
	for(Q.push(source), d[source] = 0; !Q.empty(); Q.pop())
	{
		int v = Q.front();
		
		for(auto e : adj[v])
			if(d[e.u] == -1 && e.flow > 0)
			{
				d[e.u] = 1 + d[v];
				Q.push(e.u);
			}
	}
	
	return d[sink] != -1;
}

int dfs(int v, int maxFlow)
{
	if(v == sink) return maxFlow;
	if(maxFlow == 0) return 0;
	
	for(; ptr[v] < adj[v].size(); ++ptr[v])
	{
		edge &e = adj[v][ptr[v]];

		if(d[e.u] != 1 + d[v]) continue;
		
		int augFlow = dfs(e.u, min(maxFlow, e.flow));
		
		if(augFlow)
		{
			e.flow -= augFlow;
			adj[e.u][e.rev].flow += augFlow;
			return augFlow;
		}
	}
	
	return 0;
}

int getFlow()
{
	int flow, augFlow;
	
	for(flow = 0; bfs(); )
	{
		memset(ptr, 0, sizeof ptr);
		while(augFlow = dfs(source, INF)) flow += augFlow;
	}
	
	return flow;
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	int i, x, y, z;
	
	cin >> n >> m;
	
	source = 1;
	sink = n;
	for(i = 1; i <= m; ++i)
	{
		cin >> x >> y >> z;
		addEdge(x, y, z);
	}

	cout << getFlow() << '\n';
	
	return 0;
}