Cod sursa(job #2753142)

Utilizator inwursuIanis-Vlad Ursu inwursu Data 21 mai 2021 11:11:20
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
// Flux.cpp : This file contains the 'main' function. Program execution begins and ends there.
//

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream fin{ "maxflow.in" };
ofstream fout{ "maxflow.out" };

const int oo = int(1e9);

const int MAX_N = int(1e3) + 1;
const int MAX_M = int(5e3) + 1;

int N, M;
vector<int> adj[MAX_N];

int s, t;
int capacity[MAX_N][MAX_N];
int flow[MAX_N][MAX_N];

int parent[MAX_N];

const int WHITE = 0;
const int GRAY = 1;
const int BLACK = 2;
int color[MAX_N];


void bfs_tree()
{
	for (int u = 1; u <= N; ++u)
	{
		color[u] = WHITE;
		parent[u] = 0;
	}
		

	queue<int> q;

	color[s] = GRAY;
	q.push(s);

	while (q.empty() == false)
	{
		int u = q.front();
		q.pop();

		for (int v : adj[u])
		{
			if (color[v] != WHITE) continue;
			
			if (flow[u][v] == capacity[u][v]) continue;

			if (v == t) continue;

			color[v] = GRAY;
			parent[v] = u;

			q.push(v);
		}

		color[u] = BLACK;
	}
}


int main()
{
	fin >> N >> M;

	s = 1;
	t = N;

	for (int i = 1; i <= M; ++i)
	{
		int u, v;
		fin >> u >> v;

		fin >> capacity[u][v];

		adj[u].push_back(v);
		adj[v].push_back(u);
	}


	int max_flow{ 0 };
	bool ok = true;

	while (ok)
	{
		ok = false;

		bfs_tree();

		for (int leaf : adj[t])
		{
			if (color[leaf] == WHITE || flow[leaf][t] == capacity[leaf][t]) continue;

			parent[t] = leaf;

			int augumenting_flow{ oo };

			for (int u = t; u != s; u = parent[u])
				augumenting_flow = min(augumenting_flow, capacity[parent[u]][u] - flow[parent[u]][u]);

			for (int u = t; u != s; u = parent[u])
				flow[parent[u]][u] += augumenting_flow,
				flow[u][parent[u]] -= augumenting_flow;

			max_flow += augumenting_flow;

			ok = true;
		}
	}

	fout << max_flow << endl;
}