Cod sursa(job #2209781)

Utilizator cos.lincaLinca Razvan Cosmin cos.linca Data 4 iunie 2018 18:21:03
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#include <queue>
#define nmax 1001
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int a[nmax][nmax];


bool bfs(int residualA[nmax][nmax], int s, int t, int p[], int n)
{
	bool viz[nmax];
	int i,v;
	for (i = 1; i <= n; ++i)
		viz[i] = false;

	queue<int> coada;
	coada.push(s);
	viz[s] = true;
	p[s] = -1;
	while (coada.size())
	{
		int u = coada.front();
		coada.pop();
		for(v=1; v<=n; ++v)
			if (viz[v] == false && residualA[u][v] > 0)
			{
				coada.push(v);
				p[v] = u;
				viz[v] = true;
			}
	}
	return (viz[t] == true);

}
int e_kp(int a[nmax][nmax], int s, int t, int n)
{
	int u, v;
	int residualA[nmax][nmax];
	for (u = 1; u <= n; ++u)
		for (v = 1; v <= n; ++v)
			residualA[u][v] = a[u][v];

	int p[nmax];
	int flux_maxim = 0;
	while (bfs(residualA, s, t, p,n))
	{
		int cale_r = 99999;
		for (v = t; v != s; v = p[v])
		{
			u = p[v];
			cale_r = min(cale_r, residualA[u][v]);
		}
		// update residual capacities
		for (v = t; v != s; v = p[v])
		{
			u = p[v];
			residualA[u][v] -= cale_r;
			residualA[v][u] += cale_r;
		}
		flux_maxim += cale_r;
	}
	return flux_maxim;

}
int main()
{
	int i, n, m, c, x, y;
	fin >> n >> m;
	for (i = 1; i <= m; ++i)
	{
		fin >> x >> y >> c;
		a[x][y] = c;
	}
	int fluxMaxim = e_kp(a, 1, n, n);
	fout << fluxMaxim << "\n";
	return 0;
}