// "Al menos dos de cada grupo" no es una capacidad. Tres modelos de la misma situación.
#include <iostream>
#include <vector>

#include "lower_bounds.h"

namespace {

// s = 0, A = 1, B = 2, T1 = 3, T2 = 4, t = 5
std::vector<BoundedEdge> network(long long low, long long high_group) {
    return {{0, 1, low, high_group}, {0, 2, low, high_group}, {1, 3, 0, 3}, {1, 4, 0, 1},
            {2, 4, 0, 2},            {3, 5, 0, 3},            {4, 5, 0, 2}};
}

void report(const BoundedFlow& result) {
    std::cout << "  total " << result.value << ", grupo A " << result.on_edge[0] << ", grupo B " << result.on_edge[1] << '\n';
}

}  // namespace

int main() {
    std::cout << "Grupo A: 4 personas. Grupo B: 2 personas. Turnos: T1 con cupo 3, T2 con cupo 2.\n";
    std::cout << "A puede ir a T1 (hasta 3) o a T2 (1). B solo puede ir a T2.\n\n";

    std::cout << "Sin restricción:\n";
    report(max_flow_with_lower_bounds(6, network(0, 4), 0, 5));

    std::cout << "Capacidad 2 en s -> grupo, que significa \"a lo sumo dos\":\n";
    report(max_flow_with_lower_bounds(6, network(0, 2), 0, 5));

    std::cout << "Cota inferior 2 en s -> grupo:\n";
    report(max_flow_with_lower_bounds(6, network(2, 4), 0, 5));
    std::cout << "  fuerza bruta: " << brute_bounded(6, network(2, 4), 0, 5) << '\n';

    std::cout << "\nSi B pudiera aportar solo por T2 y T2 tuviera cupo 1, no hay solución:\n";
    std::vector<BoundedEdge> impossible = network(2, 4);
    impossible[6].high = 1;
    BoundedFlow none = max_flow_with_lower_bounds(6, impossible, 0, 5);
    std::cout << "  factible: " << (none.feasible ? "sí" : "no") << ", fuerza bruta: " << brute_bounded(6, impossible, 0, 5) << '\n';
}
