// Una arista negativa: el paso de la demostración que deja de valer, con números.
#include <iostream>
#include <vector>

#include "shortest_paths.h"

int main() {
    Graph graph(4);
    add_arc(graph, 0, 1, 1);
    add_arc(graph, 0, 2, 4);
    add_arc(graph, 2, 1, -5);
    add_arc(graph, 1, 3, 2);

    std::vector<long long> truth = relax_until_stable(graph, 0);
    DijkstraResult result = dijkstra(graph, 0);
    std::cout << "se fija  con distancia  verdad\n";
    for (const Pop& pop : result.pops) {
        if (pop.stale) continue;
        std::cout << "   " << pop.node << "          " << pop.distance << "          "
                  << truth[static_cast<std::size_t>(pop.node)];
        if (pop.distance != truth[static_cast<std::size_t>(pop.node)]) std::cout << "   se rompió el invariante";
        std::cout << '\n';
    }
    std::cout << "al final, Dijkstra:";
    for (long long value : result.distance) std::cout << ' ' << value;
    std::cout << "\nal final, árbitro: ";
    for (long long value : truth) std::cout << ' ' << value;
    std::cout << '\n';
}
