// Dos choferes se turnan en cada tramo, y debe llegar manejando el que salió:
// el número de tramos tiene que ser par.
#include <iostream>
#include <vector>

#include "shortest_paths.h"
#include "state_graph.h"

namespace {

void two_way(Graph& graph, int a, int b, long long weight) {
    add_arc(graph, a, b, weight);
    add_arc(graph, b, a, weight);
}

}  // namespace

int main() {
    Graph line(6);
    two_way(line, 0, 1, 2);
    two_way(line, 1, 2, 2);
    two_way(line, 2, 3, 2);

    DijkstraResult cities = dijkstra(line, 0);
    std::cout << "sin la regla: " << cities.distance[3] << " por";
    for (int node : path_to(cities.parent, 0, 3)) std::cout << ' ' << node;
    std::cout << '\n';

    WalkResult on_line = min_walk_multiple(line, 0, 3, 2);
    std::cout << "con número par de tramos, solo la línea: "
              << (on_line.distance == UNREACHABLE ? "no hay recorrido" : "hay recorrido") << '\n';

    Graph graph = line;
    two_way(graph, 1, 4, 1);
    two_way(graph, 4, 5, 1);
    two_way(graph, 5, 1, 1);
    WalkResult even = min_walk_multiple(graph, 0, 3, 2);
    std::cout << "con número par de tramos, con el triángulo: " << even.distance << " por";
    for (int node : even.walk) std::cout << ' ' << node;
    std::cout << '\n';
}
