// DFS sobre el grafo de la clase, y lo que responde: orden, componentes y ciclos.
#include <iostream>
#include <vector>

#include "sample_graphs.h"
#include "traversals.h"

int main() {
    Graph graph = class_graph();
    std::cout << "BFS desde 0:              ";
    print_nodes(bfs(graph, 0).order);
    std::cout << "DFS recursivo desde 0:    ";
    print_nodes(dfs_recursive(graph, 0));
    std::cout << "DFS con pila de marcos:   ";
    print_nodes(dfs_iterative(graph, 0));
    std::cout << "cola de BFS con una pila: ";
    print_nodes(stack_search(graph, 0));

    Graph pieces(8);
    pieces.add_edge(0, 1);
    pieces.add_edge(1, 2);
    pieces.add_edge(3, 4);
    pieces.add_edge(5, 6);
    pieces.add_edge(6, 7);
    pieces.add_edge(7, 5);
    std::cout << "componentes de cada nodo: ";
    print_nodes(component_labels(pieces));
    std::cout << "con ciclo (no dirigido): " << (has_cycle_undirected(pieces) ? "si" : "no") << "\n";

    Graph tree(4);
    tree.add_edge(0, 1);
    tree.add_edge(1, 2);
    tree.add_edge(1, 3);
    std::cout << "arbol con ciclo: " << (has_cycle_undirected(tree) ? "si" : "no") << "\n";

    Graph tasks(4, true);
    tasks.add_edge(0, 1);
    tasks.add_edge(0, 2);
    tasks.add_edge(1, 3);
    tasks.add_edge(2, 3);
    std::cout << "dependencias con ciclo: " << (has_cycle_directed(tasks) ? "si" : "no") << "\n";
    tasks.add_edge(3, 0);
    std::cout << "agregando 3 -> 0: " << (has_cycle_directed(tasks) ? "si" : "no") << "\n";
    return 0;
}
