int* vmin(int* vertices, Grafo &my_grafo){ map <int, Aresta *> arestas = my_grafo.get_allArestas(); int *retorno = new int[arestas.size()]; // vetor dos id das arestas // primeiramente, seleciona-se as arestas conforme a regra classica de conjunto dijunto de prim for (int i = 0; i<arestas.size(); i++){ //O(m) m arestas Aresta *a = arestas[i]; if (vertices[a->getOrigem()] != vertices[a->getDestino()]){ retorno[a->getId()] = 1; } else { retorno[a->getId()] = 0; } } // depois verificamos a dominância entre as arestas for (int i = 0; i<arestas.size(); i++){ // O(m^2) if (retorno[i] == 1){ // se a aresta de id=i está contida no conjunto... Aresta *ai = arestas[i]; for (int j = i+1; j<arestas.size(); j++){ if (retorno[j] == 1 && retorno[i] == 1){ if (a_domina_b(ai, arestas[j])){ retorno[j] = 0; } else if (a_domina_b(arestas[j], ai)){ retorno[i] = 0; } } } } } return retorno; }
bool ListaAdjacente::hasInList(int n) { Aresta * p = origem; while(p != NULL){ if(p->getId() == n) return true; p = p->getProx(); } return false; }
string ListaAdjacente::printAdjacencias() { stringstream ss; Aresta * p = origem; while(p != NULL){ ss << p->getId() << " - Força: " << p->getForca() << endl; p = p->getProx(); } ss << endl; return ss.str(); }
/* recebe um vetor de inteiros, onde o valor do indice i é 1 se a aresta de id=i deve ser contabilizada retorna um vetor de aresta do grafo normal */ vector <Aresta *> maximal(Grafo *g, int *arestas, Conjunto *conjIt, vector<pair<int, int> > relacao2){ vector <Aresta *> retorno; for (int i=0; i<g->getQuantArestas(); i++){ Aresta *aresta = (g->get_allArestas())[i]; //if (arestas[aresta->getId()]!=1){ if (conjIt->compare(aresta->getOrigem(), aresta->getDestino())==false){ bool esta = false; for (int j=0; j<relacao2.size(); j++){ Aresta *firstt = (g->get_allArestas())[relacao2[j].first]; if (relacao2[j].second == aresta->getId() && conjIt->compare(firstt->getOrigem(), firstt->getDestino())==false) { esta = true; break; } } if (esta == false){ retorno.push_back(aresta); // return retorno; } } //} } return retorno; }