void componentes_fuertes(const Grafo<C> & g, Lista<Lista<int> > & componentes) { // se asume que los vertices fueron numerados de 0 a long-1 bool visitado[g.devolverLongitud()]; for (int i = 0; i < g.devolverLongitud(); i++) visitado[i] = false; Lista<int> vertices; Lista<int> recorrido; g.devolverVertices(vertices); Lista<int>::Iterador it_v = vertices.devolverIterador(); while (!it_v.llegoAlFinal()) { int v = it_v.elementoActual(); if (!visitado[v]) dfs_visit(g, v, visitado, recorrido); it_v.avanzar(); } Grafo<C> g_trasp; traspuesta_grafo(g, g_trasp); for (int i = 0; i < g.devolverLongitud(); i++) visitado[i] = false; it_v = recorrido.devolverIterador(); while (!it_v.llegoAlFinal()) { int v = it_v.elementoActual(); if (!visitado[v]) { Lista<int> componente; dfs_visit(g_trasp, v, visitado, componente); componentes.agregarFinal(componente); } it_v.avanzar(); } }
bool ciclo_hamilton(const Grafo<T> & g, int inicio, bool visitado[], int visitados, int v) { if (visitados == g.devolverLongitud()) return true; visitados++; visitado[v] = true; Lista<typename Grafo<T>::Arco> adyacentes; g.devolverAdyacentes(v, adyacentes); typename Lista<typename Grafo<T>::Arco>::Iterador ady = adyacentes.devolverIterador(); bool hay_ciclo = false; while (!hay_ciclo && !ady.llegoAlFinal()) { int u = ady.elementoActual().devolverAdyacente(); if (!poda(visitado, u, inicio, visitados, g.devolverLongitud())) hay_ciclo = ciclo_hamilton(g, inicio, visitado, visitados, u); ady.avanzar(); } visitado[v] = false; return hay_ciclo; }