while( solution.totalEdges() < graph.totalVertexes() - 1) { Edge e = graph.selectSmallerEdge(); std::cout << " " << count; std::cout << " {" << e.getFrom().getName() << "," << e.getTo().getName() << "} "; count++; // Search inside the vector for both from and to vertexes, if positive, try another. std::vector::iterator posBegin = free.begin(), posEnd = free.end(); for( ; posBegin != posEnd; posBegin++) { if ( (*posBegin).hasVertex(e.getFrom()) && (*posBegin).hasVertex(e.getTo())) { std::cout << "REJECTED" << std::endl; graph.removeFirstEdge(); // the Smaller edge is always the first. continue; } } /*! show on the screen the vectors like {a}, {b,c}, {d} each {} is a vector of vertexes inside a graph. */ posBegin = free.begin(); posEnd = free.end(); for( ; posBegin != posEnd; posBegin++) { std::vector v = (*posBegin).getVertexList(); std::vector::iterator iVertexBegin = v.begin(), iVertexEnd = v.end(); std::cout <<"{"; for(; iVertexBegin != iVertexEnd; iVertexBegin++) { std::cout<<(*iVertexBegin).getName(); if (iVertexBegin != (iVertexEnd-1)) { std::cout << ","; } } std::cout <<"}"; } std::cout << std::endl; std::cin >> stop; /* * Pega a primeira e a segunda lista de onde estão os grafos para acertar os valores. */ Graph firstGraph; Graph secondGraph; posBegin = free.begin(); for( ; posBegin != posEnd; posBegin++) { if ( (*posBegin).hasVertex(e.getFrom())) { firstGraph = (*posBegin); } } posBegin = free.begin(); for( ; posBegin != posEnd; posBegin++) { if ( (*posBegin).hasVertex(e.getTo())) { secondGraph = (*posBegin); break; } } // remove All vertexes from the secondGraph and send it to the first one std::vector v = secondGraph.getVertexList(); std::vector::iterator iVertexBegin = v.begin(), iVertexEnd = v.end(); for(; iVertexBegin != iVertexEnd; iVertexBegin++) { Vertex vertex = (*iVertexBegin); firstGraph.addVertex(vertex); secondGraph.rmVertex(vertex); } // Apava a segunda lista de vertexes usada. free.erase(posBegin); // Remove da lista do grafo. graph.removeFirstEdge(); }