Cod sursa(job #2756294)

Utilizator tekajefTeka Jef tekajef Data 30 mai 2021 17:37:54
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <vector>
#define NMAX 1005
#define INF INT_MAX
using std::ifstream;
using std::ofstream;
using std::min;

int copie[NMAX][NMAX];
int parinte[NMAX];
bool visit[NMAX];
int N, C, D;

void DFS_rec(int s) {
	visit[s] = true;
	for (int i = 1; i <= N; ++i)
		if (!visit[i] && copie[s][i] > 0)
		{
			parinte[i] = s;
			DFS_rec(i);
		}
}

bool DFS(int s, int t)
{
	memset(visit, false, sizeof(visit));
	memset(parinte, 0, sizeof(parinte));
	parinte[s] = -1;
	DFS_rec(s);
	return visit[t];
}

int flux_maxim(int s, int t) {
	int max_flux = 0, flux;
	while (DFS(s, t)) {
		flux = INF;
		for (int vecin = t; vecin != s; vecin = parinte[vecin])
			flux = min(flux, copie[parinte[vecin]][vecin]);

		for (int vecin = t; vecin != s; vecin = parinte[vecin])
		{
			copie[vecin][parinte[vecin]] += flux;
			copie[parinte[vecin]][vecin] -= flux;
		}

		max_flux += flux;
	}
	return max_flux;
}

int main() {

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

	fin >> N >> D;
	for (int i = 1; i <= D; i++) {
		int x, y, m;
		fin >> x >> y >> m;
		copie[x][y] += m;
	}

	int x = flux_maxim(1, N);
	fout << x << "\n";
	//for (int i=0;i<C;++i)
	//	fout << copie[i][N] << " ";
	fin.close();
	fout.close();

	return 0;
}