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(); } }
void traspuesta_grafo(const Grafo<C> & g, Grafo<C> & r) { Lista<int> vertices; g.devolverVertices(vertices); Lista<int>::Iterador it_v = vertices.devolverIterador(); while (!it_v.llegoAlFinal()) { r.agregarVertice(it_v.elementoActual()); it_v.avanzar(); } it_v = vertices.devolverIterador(); while (!it_v.llegoAlFinal()) { int v = it_v.elementoActual(); Lista<typename Grafo<C>::Arco> adyacentes; g.devolverAdyacentes(v, adyacentes); typename Lista<typename Grafo<C>::Arco>::Iterador ady = adyacentes.devolverIterador(); while (!ady.llegoAlFinal()) { r.agregarArco(ady.elementoActual().devolverAdyacente(), v, ady.elementoActual().devolverCosto()); ady.avanzar(); } it_v.avanzar(); } }