Cod sursa(job #2638091)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 26 iulie 2020 20:04:44
Problema Flux maxim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>

using namespace std;

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

const int NMAX = 1005;

/*

Citesc Graful
Cat timp reusesc sa fac drumuri augmentative cu bfs
	Iau toate muciile care merg in destinatie
		x = muchie
		iau w capacitatea minima ramasa
		updatez pathul mergand prin parinti (si alea reziduale)
		adaug la flow
		updatez muchia
	resetez

1 e sursa
n e destinatia
*/



int p[NMAX];
vector<int>G[NMAX];
int cap[NMAX][NMAX];
int n, m, x, y, z;
queue<int>q;

void read()
{
	fin >> n >> m;
	while (m--)
	{
		fin >> x >> y >> z;
		cap[x][y] = z;
		G[x].push_back(y);
		G[y].push_back(x);
	}
}

int bfs()
{
	while (!q.empty())
		q.pop();
	q.push(1);///sursa
	while (!q.empty())
	{
		int u = q.front();
		q.pop();
		if (u == n) ///destinatie
			break;
		for (int v : G[u])
		{
			if (!p[v] && cap[u][v] > 0)
			{
				p[v] = u;
				q.push(v);
			}
		}
	}
	return p[n]; /// de destinatie
	/// in p am relatiile de parinti ca sa fac pathurile dupa
}

void solve()
{
	int flux = 0;
	while (bfs())
	{
		for (int v : G[n])
		{
			int capMin = cap[v][n];
			for (int i = v; i != 1; i = p[i])
				capMin = min(capMin, cap[p[i]][i]);
			for (int i = v; i != 1; i = p[i])
			{
				cap[p[i]][i] -= capMin;
				cap[i][p[i]] += capMin;
			}
			flux += capMin;
			cap[v][n] -= capMin;
			cap[n][v] += capMin;
		}
		for (int i = 0; i <= n; i++)
			p[i] = 0;
	}
	fout << flux << "\n";
}

int main()
{
	read();
	solve();
	return 0;
}