Cod sursa(job #2898560)

Utilizator tiut_cristianTiut Cristian tiut_cristian Data 7 mai 2022 08:57:30
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

int C[1024][1024];
int F[1024][1024];
int TT[1024];
vector<int> G[1024];
int N, M;
int cd[1024]; //coada
int viz[1024];

int BF()
{
	int i, j, nod, V;

	cd[0] = cd[1] = 1;
	memset(viz, 0, sizeof(viz));
	viz[1] = 1;

	for (i = 1; i <= cd[0]; i++)
	{
		nod = cd[i];
        if (nod == N)
            continue;
		for (j = 0; j < G[nod].size(); j++)
			{
				V = G[nod][j];
				if (C[nod][V] == F[nod][V] || viz[V])
                    continue;
				viz[V] = 1;
				cd[ ++cd[0] ] = V;
				TT[V] = nod;
			}
	}

	return viz[N];
}

int main()
{
	int i, flow, fmin, x, y, z, nod;

	fin >> N >> M;

	for (i = 1; i <= M; i++)
	{
		fin >> x >> y >> z;
		C[x][y] += z;
		G[x].push_back(y);
		G[y].push_back(x);
	}

	flow = 0;
	while(BF())
		for (i = 0; i < G[N].size(); i++)
		{
			nod = G[N][i];
			if (F[nod][N] == C[nod][N] || !viz[nod])
                continue;
			TT[N] = nod;

			fmin = 550000005;
			for (nod = N; nod != 1; nod = TT[nod])
				fmin = min(fmin, C[ TT[nod] ][nod] - F[ TT[nod] ][nod]);
			if (fmin == 0)
                continue;

			for (nod = N; nod != 1; nod = TT[nod])
			{
				F[ TT[nod] ][nod] += fmin;
				F[nod][ TT[nod] ] -= fmin;
			}
			flow += fmin;
		}

	fout << flow;
	return 0;
}