Cod sursa(job #2554154)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 22 februarie 2020 17:09:57
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#include <cstring>
#define INF 9999999
#define min(a,b) (a<b) ? (a) : (b)
 
using namespace std;
 
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
 
void BFS();
 
int n, m, nrfr, minim, frunze[1005], tata[1005], f[1005][1005], c[1005][1005], a[1005][1005];
 
int main()
{
	int i, j, x, y, schimbare;
 
	fin >> n >> m;
	for (i = 1; i <= m; i++)
	{
		fin >> x >> y;
		fin >> c[x][y];
		a[x][y] = a[y][x] = 1;
	}
	do
	{
		schimbare = 0;
		BFS();
		for (i = 1; i <= nrfr; i++)
		{
			tata[n] = frunze[i];
			x = n;
			minim = INF;
			while (x != 1)
			{
				minim = min(minim, c[tata[x]][x] - f[tata[x]][x]);
				x = tata[x];
			}
			if (minim)
			{
				schimbare = 1;
				x = n;
				while (x != 1)
				{
					f[tata[x]][x] += minim;
					f[x][tata[x]] -= minim;
					x = tata[x];
				}
			}
		}
	} while (schimbare);
	x = 0;
	for (i = 1; i <= n; i++)
		if (f[1][i] > 0)
			x += f[1][i];
	fout << x << '\n';
	return 0;
}
 
void BFS()
{
	int i, aux, in, sf, C[1005], uz[1005];
 
	in = sf = 0;
	nrfr = 0;
	memset(uz, 0, sizeof(uz));
	C[sf++] = 1;
	uz[1] = 1;
	while (in < sf)
	{
		aux = C[in++];
		for (i = 1; i < n;i++)
			if (a[aux][i] && !uz[i] && f[aux][i]<c[aux][i])
			{
				tata[i] = aux;
				C[sf++] = i;
				uz[i] = 1;
			}
		if (a[aux][n] && f[aux][n] < c[aux][n])
			frunze[++nrfr] = aux;
	}
}