Cod sursa(job #2955042)

Utilizator Rares_StefanoiuRares Stefanoiu Rares_Stefanoiu Data 15 decembrie 2022 23:21:05
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;

int root, dest, n, m, n1, n2, c, total;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

vector<int>tati;
vector<vector<int>>lista;
int flux[1001][1001];
vector<bool>label;


bool BFS() {
	queue<int>q;
	for (int i = 1; i <= n; i++)
	{
		tati[i] = 0;
		label[i] = 0;
	}
	label[1] = 1;
	q.push(1);
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		for (auto el : lista[x]) {
			if (label[el] == 0 && flux[x][el] > 0) {
				tati[el] = x;
				q.push(el);
				label[el] = 1;
				if (el== n)
					return 1;
			}
		}
	}
	return 0;

}

int main() {
	f >> n >> m;
	label.resize(n + 1);
	tati.resize(n + 1);
	lista.resize(n + 1);
	for (int i = 1; i <= m; i++)
	{
		f >> n1 >> n2 >> c;
		lista[n1].push_back(n2);
		lista[n2].push_back(n1);
		flux[n1][n2] = c;
	}
	while (BFS()) {
		for (auto el : lista[n])
		{
			if (!label[el])
				continue;
			int min1 = 10000000;
			int v = n;
			while (v != 1)
			{
				min1 = min(min1, flux[tati[v]][v]);
				v = tati[v];
			}
			v = n;
			while (v != 1) {
				flux[tati[v]][v] -= min1;
				flux[v][tati[v]] += min1;
				v = tati[v];
			}
			total = total + min1;
		}
	}
	g << total;
}