Cod sursa(job #2064565)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 12 noiembrie 2017 15:30:59
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

#define dbg(x) //cerr<<#x": "<<x<<"\n"
#define dbg_v(x, n) do{cerr<<#x"[]: ";for(int _=0;_<n;++_)cerr<<x[_]<<" ";cerr<<'\n';}while(0)
#define dbg_ok cerr<<"OK!\n"
#define DMAX 500
#define NMAX 1
#define MMAX 1

using namespace std;

int n, k, x, src, dest, m;
string s;
int from, to, cost;
int c[DMAX][DMAX], f[DMAX][DMAX], use[DMAX];
int c1[DMAX][DMAX], f1[DMAX][DMAX];
int flow;
vector <int> v[DMAX];

int dfs(int node, int flow)
{
	dbg(node);
	if(flow == 0)
		return 0;
	if(node == dest)
		return flow;

	for(int i = 1; i <= n; i++)
	{
		if(use[i])
			 continue;
		if(f[node][i] < c[node][i])
		{
			int to_send = min(flow, c[node][i] - f[node][i]);
			use[i] = 1;
			int recv = dfs(i, to_send);
			f[node][i] += recv;
			f1[i][node] -= recv;
			if(recv > 0)
				return recv;
		} 
		else 
			if(f1[node][i] < c1[node][i])
			{
				int to_send = min(flow, c1[node][i] - f1[node][i]);
				use[i] = 1;
				int recv = dfs(i, to_send);
				f1[node][i] += recv;
				f[i][node] -= recv;
				if(recv > 0)
					return recv;
			}
	}
	return 0;
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	//ios_base::sync_with_stdio(false);
	cin >> n >> m;
	for(int i = 1; i <= m; i++)
	{
		cin >> from >> to >> cost;
		c[from][to] = cost;
		c1[to][from] = 0;
	}
	//cin >> src >> dest;
	src = 1;
	dest = n;
	int fl = dfs(src, 100000);
	while(fl > 0){
		memset(use, 0, sizeof use);
		dbg(fl);
		flow += fl;
		fl = dfs(src, 100000);
		if(flow > 10)
			break;
	}
	cout << flow << '\n';
}