Cod sursa(job #2682483)

Utilizator Marius05Voina Marius Marius05 Data 8 decembrie 2020 19:15:21
Problema Flux maxim Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <algorithm>
#include <climits>
#include <fstream>
#include <queue>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int NMAX = 100, INF = INT_MAX;

vector<int> t;
int C[NMAX + 5][NMAX + 5], F[NMAX + 5][NMAX + 5];
int n, m, u, v, cost, s, f, flux, i;

bool bfs(int s, int f)
{
	queue<int> q;
	int nod, i;
	t.assign(n + 5, 0);
	t[s] = -1;
	q.push(s);
	while (!q.empty())
	{
		nod = q.front();
		for (i = 1; i <= n; ++i)
			if (!t[i] && C[nod][i] - F[nod][i] > 0)
			{
				q.push(i);
				t[i] = nod;
				if (i == f)
					return true;
			}
		q.pop();
	}
	return 0;
}

void flux_max()
{
	int cr, i;
	for (flux = 0; bfs(s, f); flux += cr)
	{
		cr = INF;
		i = f;
		while (i != s)
		{
			cr = min(cr, C[t[i]][i] - F[t[i]][i]);
			i = t[i];
		}
		i = f;
		while (i != s)
		{
			F[t[i]][i] += cr;
			F[i][t[i]] += cr;
			i = t[i];
		}
	}
}

int main()
{
	fin >> n >> m;
	t.assign(n + 5, 0);
	s = 1;
	f = n;
	for (i = 0; i < m; ++i)
	{
		fin >> u >> v >> cost;
		C[u][v] = cost;
	}
	flux_max();
	fout << flux;
	fin.close();
	fout.close();
	return 0;
}