Cod sursa(job #2701974)

Utilizator sebimihMihalache Sebastian sebimih Data 2 februarie 2021 15:07:18
Problema Flux maxim Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

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

const int N = 1005;

int n, m;
int cap[N][N], flow[N][N], t[N];
vector<int> g[N];
vector<bool> vizitat;

bool bfs()
{
	vizitat.assign(n + 1, false);

	queue<int> coada;
	coada.push(1);
	vizitat[1] = true;
	t[1] = 0;

	while (!coada.empty())
	{
		int nod = coada.front();
		coada.pop();

		if (nod == n)
			continue;

		for (int nextNod : g[nod])
		{
			if (!vizitat[nextNod] && cap[nod][nextNod] != flow[nod][nextNod])
			{
				vizitat[nextNod] = true;
				t[nextNod] = nod;
				coada.push(nextNod);
			}
		}
	}

	return vizitat[n];
}

int main()
{
	fin >> n >> m;

	for (int i = 0; i < m; i++)
	{
		int x, y, c;
		fin >> x >> y >> c;
		g[x].push_back(y);
		g[y].push_back(x);
		cap[x][y] = c;
	}

	int flowMax = 0;
	while (bfs())
	{
		for (int y : g[n])
		{
			if (!vizitat[y] || cap[y][n] == flow[y][n])
				continue;

			t[n] = y;

			int fmin = 1 << 30;
			for (int nod = n; nod != 1; nod = t[nod])
				fmin = min(fmin, cap[t[nod]][nod] - flow[t[nod]][nod]);

			if (fmin == 0)
				continue;

			flowMax += fmin;
			for (int nod = n; nod != 1; nod = t[nod])
				flow[t[nod]][nod] += fmin;
		}
	}

	fout << flowMax;
}