Cod sursa(job #2873849)

Utilizator ctlucvCretu Luca ctlucv Data 19 martie 2022 11:52:50
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <queue>

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

typedef std::vector<std::vector<int>> mat;

int n, m, flow;
mat V, C;
std::vector<int> root;

inline void read()
{
	int i, j, c;

	fin >> n >> m;

	V.resize(1LL * n + 1);
	C.resize(1LL * n + 1);
	root.resize(1LL * n + 1);

	for (int i = 1; i <= n; ++i)
		C[i].resize(1LL * n + 1);

	for (int k = 1; k <= m; ++k)
	{
		fin >> i >> j >> c;

		V[i].push_back(j);
		V[j].push_back(i);
		C[i][j] = c;
	}
}

inline bool bfs(int k)
{
	std::queue<int> Q;

	Q.push(k);
	fill(root.begin(), root.end(), 0);

	while (!Q.empty())
	{
		k = Q.front(), Q.pop();

		for (auto const& i : V[k])
			if (!root[i] && C[k][i] > 0)
			{
				root[i] = k;
				Q.push(i);

				if (i == n)
					return true;
			}
	}

	return false;
}

inline void search(int const& start)
{
	int cmin, i;

	while (bfs(start))
	{
		cmin = 2e9, i = n;

		while (i != start)
		{
			if (C[root[i]][i] < cmin)
				cmin = C[root[i]][i];
			i = root[i];
		}

		flow += cmin;

		i = n;

		while (i != start)
		{
			C[root[i]][i] -= cmin;
			C[i][root[i]] += cmin;
			i = root[i];
		}
	}
}

inline void display()
{
	fout << flow;
}

int main()
{
	read();
	search(1);
	display();
	return 0;
}