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(); } }
int main(int argc, char const *argv[]) { Lista *l; l = new Lista(); Nodo *a = new Nodo(1); l->agregarInicio(a); l->agregarFinal(new Nodo(3)); l->agregarFinal(new Nodo(4)); l->agregar(new Nodo(2), 2); l->agregar(new Nodo(7), 3); l->imprimir(); return 0; }
void caminos_simples(const Grafo<C> & grafo, int origen, int destino, bool visitado[], Lista<Lista<int> > & caminos, Lista<int> & camino_parcial) { visitado[origen] = true; camino_parcial.agregarFinal(origen); if (origen == destino) { caminos.agregarFinal(camino_parcial); camino_parcial.eliminarFinal(); visitado[origen] = false; return; } Lista<typename Grafo<C>::Arco> adyacentes; grafo.devolverAdyacentes(origen, adyacentes); typename Lista<typename Grafo<C>::Arco>::Iterador ady = adyacentes.devolverIterador(); while (!ady.llegoAlFinal()) { int v = ady.elementoActual().devolverAdyacente(); if (!visitado[v]) caminos_simples(grafo, v, destino, visitado, caminos, camino_parcial); ady.avanzar(); } camino_parcial.eliminarFinal(); visitado[origen] = false; }