Cod sursa(job #2008902)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 7 august 2017 22:26:06
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 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 NMAX 10010

int pred[NMAX];
int f[NMAX][NMAX], c[NMAX][NMAX];
bool vis[NMAX];
vector<int> adj[NMAX];

bool bfs(int source, int sink)
{
	int v;
	
	memset(vis, 0, sizeof vis);
	queue<int> Q;
	
	for(Q.push(source), vis[source] = true; !Q.empty(); Q.pop())
	{
		v = Q.front();
		
		for(auto u : adj[v])
			if(!vis[u] && f[v][u] < c[v][u])
			{
				vis[u] = true;
				pred[u] = v;
				
				if(u != sink)
					Q.push(u);
			}
	}
	
	return vis[sink];
}

int increaseFlow(int source, int node, int sink)
{
	int minFlow = INF;
	
	pred[sink] = node;
	
	for(int v = sink; v != source && minFlow > 0; v = pred[v])
		minFlow = min(minFlow, c[pred[v]][v] - f[pred[v]][v]);
	
	if(minFlow)
	{
		for(int v = sink; v != source; v = pred[v])
			f[pred[v]][v] += minFlow,
			f[v][pred[v]] -= minFlow;
	}
	
	return minFlow;
}

int getFlow(int source, int sink)
{
	int flow = 0;
	
	while(bfs(source, sink))
	{
		for(auto u : adj[sink])
			if(vis[u])
				flow += increaseFlow(source, u, sink);
	}
	
	return flow;
}

void addEdge(int a, int b, int cap)
{
	adj[a].push_back(b);
	adj[b].push_back(a);
	c[a][b] += cap;
}

int main()
{
#ifndef ONLINE_JUDGE
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
#endif
	ios_base::sync_with_stdio(false);
	
	int q, i, n, m, p, k, a, source, sink;
	
	source = 0;
	sink = NMAX - 1;
	
	//for(cin >> q; q; --q)
	{
		memset(f, 0, sizeof f);
		memset(c, 0, sizeof c);
		for(i = 0; i < NMAX; ++i) adj[i].clear();
		
		cin >> n >> m;
	
		source = 1;
		sink = n;
		
		for(int i = 1; i <= m; ++i)
		{
			int b, cap;
			cin >> a >> b >> cap;
			addEdge(a, b, cap);
		}
		
		/*for(i = 2; i <= n; ++i)
		{
			cin >> p;
			addEdge(p, i, n);
		}
		
		for(i = 1; i <= m; ++i)
		{
			addEdge(source, n + i, 1);
			for(cin >> k; k; --k)
			{
				cin >> a;
				addEdge(n + i, a, 1);
			}
		}
		
		for(i = 1; i <= n; ++i)
			addEdge(i, sink, 1);
		*/
		cout << getFlow(source, sink) << '\n';
	}
	
	return 0;
}