Cod sursa(job #2834644)

Utilizator lolotbogdanLolot Stefan-Bogdan lolotbogdan Data 17 ianuarie 2022 13:37:51
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

int n, m, flux_maxim;

vector<vector<int>>vecini;
vector<int>vizitat;
vector<int>tata;
vector<vector<int>>capacitate;

int bfs()
{
	for (int i = 1; i <= n; i++)
		tata[i] = vizitat[i] = 0;
	
	queue<pair<int, int>>coada;

	vizitat[1] = 1;

	coada.push(make_pair(1, 999999));

	while (!coada.empty())
	{
		int u = coada.front().first;
		int flux = coada.front().second;

		coada.pop();

		for (int i = 0; i < vecini[u].size(); i++)
		{
			int v = vecini[u][i];

			if (vizitat[v] == 0 && capacitate[u][v])
			{
				vizitat[v] = 1;

				tata[v] = u;

				int flux_nou = min(flux, capacitate[u][v]);

				if (v == n)
					return flux_nou;

				coada.push(make_pair( v, flux_nou));
			}
		}
	}
	return 0;
}

int maxflow()
{
	int flux = 0;
	int flux_nou;

	while (flux_nou = bfs())
	{
		flux += flux_nou;

		int nod = n;

		while (nod != 1)
		{
			capacitate[tata[nod]][nod] -= flux_nou;
			capacitate[nod][tata[nod]] += flux_nou;
		
			nod = tata[nod];
		}
	}

	return flux;
}

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

	vecini.resize(n + 1);
	capacitate.resize(n + 1, vector<int>(n + 1, 0));
	tata.resize(n + 1);
	vizitat.resize(n + 1);
	
	for (int i = 1; i <= m; i++)
	{
		int x, y, z;

		f >> x >> y >> z;

		vecini[x].push_back(y);
		vecini[y].push_back(x);
		
		capacitate[x][y] += z;
	}


	flux_maxim = maxflow();

	g << flux_maxim;

	return 0;
}