Cod sursa(job #2197360)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 21 aprilie 2018 21:48:02
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 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 MOD 1000000007
#define ST_SIZE 1048600
#define QMAX 
#define VMAX 1010

int Source = 0;
int Sink = VMAX - 1;

struct Edge {
	int to, flow;
};

int lv[VMAX], ptr[VMAX];
vector<int> adj[VMAX];
vector<Edge> edges;

void addEdge(int a, int b, int flow) {
	edges.push_back({b, flow});
	edges.push_back({a, 0});
	
	adj[a].push_back(edges.size() - 2);
	adj[b].push_back(edges.size() - 1);
}

bool bfs(int v) {
	queue<int> q;
	
	memset(lv, 0, sizeof lv);
	for(lv[v] = 1, q.push(v); !q.empty(); q.pop()) {
		v = q.front();
		
		for(auto e : adj[v])
			if(edges[e].flow && !lv[edges[e].to]) {
				lv[edges[e].to] = 1 + lv[v];
				q.push(edges[e].to);
			}
	}
	
	return lv[Sink] != 0;
}

int dfs(int v, int flow) {
	if(v == Sink) return flow;
	
	int pushed;
	for(; ptr[v] < (int) adj[v].size(); ++ptr[v]) {
		auto e = adj[v][ptr[v]];
		
		if(edges[e].flow && lv[edges[e].to] == 1 + lv[v]) {
			pushed = dfs(edges[e].to, min(edges[e].flow, flow));

			if(pushed) {
				edges[e].flow -= pushed;
				edges[e ^ 1].flow += pushed;
				return pushed;
			}
		}
	}
	
	return 0;
}

int dinic() {
	int flow = 0, pushed;
	
	while(bfs(Source)) {
		memset(ptr, 0, sizeof ptr);
		while(pushed = dfs(Source, INF))
			flow += pushed;
	}
	
	return flow;
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	ios_base::sync_with_stdio(false);
	
	int i, j, n, m, a, b, c;
	
	cin >> n >> m;
	for(i = 1; i <= m; ++i) {
		cin >> a >> b >> c;
		addEdge(a, b, c);
	}
	
	Source = 1;
	Sink = n;
	cout << dinic() << '\n';
	
	return 0;
}