Cod sursa(job #2753664)

Utilizator alexaelizaAlexa Oana-Eliza alexaeliza Data 23 mai 2021 22:52:07
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INT_MAX 2147483646
using namespace std;

int flux_minim(int** a, int** flux, int s, int d, vector<int>& tati) {
	int mini = INT_MAX;
	for (int i = d; i != s; i = tati[i]) {
		if (mini > a[tati[i]][i] - flux[tati[i]][i]) {
			mini = a[tati[i]][i] - flux[tati[i]][i];
		}
	}
	return mini;
}

bool BFS(int** a, int** flux, int s, int d, vector<int>& tati) {
	queue<int> q;
	vector<bool> viz(tati.size(), false);
	fill(tati.begin(), tati.end(), -1);

	q.push(s);
	viz[s] = true;

	while (!q.empty()) {
		int prim = q.front();
		q.pop();
		for (int i = 0; i < tati.size(); i++) {
			if (a[prim][i] > 0 && !viz[i]) {
				if (a[prim][i] - flux[prim][i] > 0) {
					q.push(i);
					tati[i] = prim;
					viz[i] = true;
				}
			}
		}
	}
	return viz[d];
}

int admond_penis(int** a, int** flux, int s, int d , vector<int>& tati) {
	int fluxos = 0;
	while (BFS(a, flux, s, d, tati)) {

		int mini = flux_minim(a, flux, s, d, tati);

		for (int i = d; i != s; i = tati[i]) {
			flux[tati[i]][i] += mini;
			flux[i][tati[i]] -= mini;
		}
		fluxos += mini;
	}
	return fluxos;
}

int main()
{
	ifstream fin("maxflow.in");
	ofstream fout("maxflow.out");
	int n, c, m;
	
	fin >> n >> m; 
	c = 1;
	int** a = new int* [n + 1];
	int** flux = new int* [n + 1];
	for (int i = 0; i <= n; i++) {
		a[i] = new int[n + 1];
		fill(a[i], a[i] + n + 1, 0);
		flux[i] = new int[n + 1];
		fill(flux[i], flux[i] + n + 1, 0);
	}
	vector<int> tati(n + 1, -1);

	for (int i = 0; i < m; i++) {
		int x, y, f;
		x--;
		y--;
		fin >> x >> y >> f;
		a[x][y] = f;
	}


	for (int i = 0; i < c; i++) {
		a[n][i] = INT_MAX;
	}

	int pula =admond_penis(a, flux, n, n - 1, tati);
	fout << pula;


	for (int i = 0; i <= n; i++) {
		delete[] a[i];
		delete[] flux[i];
	}
	delete[] flux;
	delete[] a;
	return 0;
}