// Dos ideas parecidas a Dijkstra, contra el árbitro.
#include <iostream>
#include <vector>

#include "shortest_paths.h"

int main() {
    Graph first(3);
    add_arc(first, 0, 1, 4);
    add_arc(first, 0, 2, 1);
    add_arc(first, 2, 1, 2);
    std::cout << "0 -> 1 (4), 0 -> 2 (1), 2 -> 1 (2). Distancia a 1:\n";
    std::cout << "  fijar al descubrir: " << fix_on_discovery(first, 0)[1] << '\n';
    std::cout << "  Dijkstra:           " << dijkstra(first, 0).distance[1] << '\n';
    std::cout << "  árbitro:            " << relax_until_stable(first, 0)[1] << '\n';

    Graph second(4);
    add_arc(second, 0, 1, 1);
    add_arc(second, 1, 3, 10);
    add_arc(second, 0, 2, 2);
    add_arc(second, 2, 3, 2);
    std::cout << "0 -> 1 (1), 1 -> 3 (10), 0 -> 2 (2), 2 -> 3 (2). Distancia a 3:\n";
    std::cout << "  arco más barato:    " << cheapest_arc_walk(second, 0, 3) << '\n';
    std::cout << "  Dijkstra:           " << dijkstra(second, 0).distance[3] << '\n';
    std::cout << "  árbitro:            " << relax_until_stable(second, 0)[3] << '\n';
}
