Cod sursa(job #2955032)

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

int root, n, m, n1, n2, c, total;
int flux[1000][1000];

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

vector<int>tati;
vector<vector<int>>lista;
vector<bool>label;


bool BFS(int root) {
	queue<int>q;
	for(int i=1;i<=n;i++)
	{
		tati[i] = 0;
		label[i] = 0;
	}
	label[root] = 1;
	q.push(root);
	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);
				if (x == n)
					return 1;
				label[el] = 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(1)) {
			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;
	}