示例#1
0
graf_bib::Matriz graf_bib::grafo::completarGrafo(void) {

    Matriz *ret = NULL;

    if(!completo()) {

        ret = new Matriz(matrizRep);

        for(Matriz::iterator linha = ret->begin();
                linha != ret->end();
                ++linha) {

            for(Linha::iterator it = linha->begin();
                    it != linha->end();
                    ++it) {

                if(*it == 0 &&
                    (linha - ret->begin()) != (it - linha->begin()) )
                    *it = 1;

                else
                    *it = 0;
            }
        }
    }

    return *ret;
}
示例#2
0
void graf_bib::grafo::num_componentes (void){
    int componentes=0;
    int vertice=0;
    set<int> verticesDoComponente;//TODO: inicializar
    // Lista para vertices que nao verificou vertices adjacentes
    list<int> verticesNaoVerificados;//TODO: inicializar
    for (vertice=0; vertice < numVertices; vertice++) {
        verticesNaoVerificados.push_back(vertice);
    }
    //Matriz de adjacencias
    Matriz *ret = new Matriz(matrizRep);
    Matriz::iterator linha = ++(ret->begin());

    while(!verticesNaoVerificados.empty()) {
        for(Linha::iterator it = linha->begin(); it != linha->end(); ++it) {//itera nos vertices adjacentes
            if (*it ==1) {
                verticesDoComponente.insert(it - (linha->begin()));
            }
        }
        verticesNaoVerificados.remove(linha-(ret->begin()));
        if (!verticesDoComponente.empty()) {
            linha = ret->begin() + *(++verticesDoComponente.begin());
        } else {
            componentes++;
        }
    }
}
示例#3
0
void graf_bib::grafo::dfs_visit(const unsigned int &vertice) {
	corVertice[vertice] = "cinza";
	//Matriz de adjacencias do grafo
	Matriz *ret = new Matriz(matrizRep);
    Matriz::iterator linha = ret->begin() + vertice;
	// Trbalha com vertices adjacentes ao vertice atual
	for(Linha::iterator it = linha->begin(); it != linha->end(); ++it) {
		if (*it == 1) {
            int indiceAdj = it -(linha->begin());//indice do vertice adjacente
            if (corVertice[indiceAdj]=="branco") {
                dfs_visit(indiceAdj);
            }
		}
	}
	corVertice[vertice] = "preto";
}
示例#4
0
bool graf_bib::grafo::hamiltoniano (void) {
    //TODO checar se tem apenas 1 componente antes

    Matriz *ret = new Matriz(matrizRep);
    list < int > verticesChecados;//TODO: inicializar
    vector< list < int > > fila;//TODO: inicializar
    Matriz::iterator linha = ++(ret->begin());
    int indiceVertice = 0;

    while(!fila[0].empty()) {
        for(Linha::iterator it = linha->begin(); it != linha->end(); ++it) {//itera nos vertices adjacentes
            if (*it ==1) {//Adiciona os vertices adjacentes a uma fila de prioridades
                fila[indiceVertice].push_front(it - (linha->begin()));
            }
        }
        if (!(fila[indiceVertice].empty()) && find(verticesChecados.begin(),verticesChecados.end(),fila[indiceVertice].front())==verticesChecados.end()) {//vertice ainda nao esta no ciclo
            //Adiciona um vertice ao ciclo de hamilton
            verticesChecados.push_back(fila[indiceVertice].front());
            //Proximo vertice a verificar seus vertices adjacentes
            linha = ret->begin() + (fila[indiceVertice].front());
            indiceVertice = linha - (ret->begin());
            // Retira o vertice da fila de prioridades
            fila[indiceVertice].pop_front();
        } else {
            while (find(verticesChecados.begin(),verticesChecados.end(),fila[indiceVertice].front()) != verticesChecados.end()){//checa se vertice ja esta no ciclo
                if (verticesChecados.size()== numVertices && fila[indiceVertice].front() == verticesChecados.front()) {//encontrou ciclo
                    return true;
                } else {//ciclo ainda nao encontrado
                    if (fila[indiceVertice].empty()) {//volta para outra combinacao sem adicionar vertice ao ciclo
                        verticesChecados.pop_back();
                        linha = ret->begin() + indiceVertice -1;//volta para vertice anterior
                        indiceVertice = linha - (ret->begin());
                    } else {
                        // Retira o vertice da fila de prioridades
                        fila[indiceVertice].pop_front();
                        //Proximo vertice a verificar seus vertices adjacentes
                        linha = ret->begin() + (fila[indiceVertice].front());
                        indiceVertice = linha - (ret->begin());
                    }
                }
            }
        }
    }
    return false;
}