Ver Mensaje Individual
  #8 (permalink)  
Antiguo 22/05/2015, 17:05
Avatar de xKuZz
xKuZz
 
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: circuito hamiltoniano

Te recomiendo que empieces de 0 la parte del circuito hamiltoniano. Creo que no has entendido muy bien el algoritmo para implementarlo. Ya que te urge y yo necesito ya irme a dormir te voy a dejar un código que hice hace un tiempo que resuelve ese algoritmo y en el que está aplicando todo al detalle (creo). Ten en cuenta que copiar y pegar no te va a servir porque utilizo cosas como los vectores de la STL, algoritmos de la STL y funciones lambda de C++11 que estaba empezando a utilizar por aquel entonces. Utilízalo como referencia y adáptalo a las cosas que tu estás utilizando. Mucha suerte.

Código C++:
Ver original
  1. /* @file: ciclohamilton.cpp
  2.    @brief: Comprueba si hay un ciclo de Hamilton en el grafo por fuerza bruta.
  3.            El grafo viene representado por la matriz de adyacencia
  4.    @author: xKuZz
  5. */
  6.  
  7. #include <algorithm>
  8. #include <iostream>
  9. #include <vector>
  10.  
  11. using namespace std;
  12.  
  13. typedef vector < vector <int> > int_2;
  14.  
  15. bool usar(const int &vertice, const int_2 &grafo, const vector<int> &camino, const int &posicion){
  16.     // CUMPLIR LAS DOS CONDICIONES SIGUIENTES IMPLICA QUE ES UN POSIBLE VÉRTICE SIGUIENTE EN EL CAMINO
  17.     bool USAR=true;
  18.    // Compruebo que el vértice sea adyacente al anterior
  19.     if (grafo[camino[posicion-1]][vertice]==0)
  20.         USAR=false;
  21.    // Si es adyacente compruebo también que no esté en el camino utilizado
  22.     for_each(camino.begin(),camino.end(),[&](int i=0){if (camino[i]==vertice) USAR=false;});
  23.     return USAR;
  24. }
  25.  
  26. bool HamiltonRecursivo(const int_2 &grafo, vector<int> &camino, const int &posicion){
  27.    // ESTA ES UNA MANERA RECURSIVA DE COMPROBAR QUE UN CAMINO ES DE HAMILTON
  28.     bool hamiltoniano=false;
  29.  
  30.     // CASO FINAL: si posición es igual al tamaño del vector camino
  31.  
  32.     if (posicion==camino.size())
  33.         hamiltoniano=grafo[camino[posicion-1]][0]; // Devuelvo si adyacen o no el principio y el final del ciclo
  34.  
  35.     else { // CASO NO FINAL
  36.  
  37.         // IMPLEMENTACIÓN RECURSIVA: PROBAMOS TODOS LOS VÉRTICES MENOS EL 0 ya que lo hemos considerado el inicial
  38.         for (int v=1; v < camino.size(); v++){
  39.        
  40.         // UTILIZO LA FUNCIÓN PARA COMPROBAR EL VÉRTICE
  41.                 if (usar(v, grafo, camino, posicion)){
  42.  
  43.                         camino[posicion] = v; // METO EL VÉRTICE SI LA COMPROBACIÓN ES CORRECTA
  44.  
  45.                         // UTILIZO ESTA FUNCIÓN EN RECURRENCIA PARA AVERIGUAR EL RESTO DEL CAMINO
  46.                         if(HamiltonRecursivo (grafo, camino, posicion+1))
  47.                     return true;
  48.  
  49.                     // SI EL VERTICE NO ME LLEVA HACIA LA SOLUCIÓN PONGO UN -1 PARA INDICARLO
  50.                             camino[posicion] = -1;
  51.             }
  52.             }
  53.         }
  54.            
  55.     return hamiltoniano;   
  56.        
  57. }
  58.  
  59. bool CicloHamilton(vector<int> &sol, const int_2 &grafo){
  60.     // Sol es el camino solución obtenido
  61.     // Devuelve TRUE si hay ciclo de Hamilton
  62.     // Dicho ciclo de Hamilton se guarda en el vector sol
  63.    
  64.     // DIMENSIONO LA MATRIZ PARA ALMACENAR EL CAMINO
  65.     sol.resize(grafo.size());
  66.     // RELLENO LA MATRIZ DE -1
  67.     fill(sol.begin(),sol.end(),-1);
  68.     // El primer dato será un 0
  69.     sol[0]=0;
  70.  
  71.     // LLAMO AL MÉTODO RECURSIVO
  72.     if (!HamiltonRecursivo(grafo, sol, 1))
  73.         {
  74.             cout << "No hay solución";
  75.             return false;
  76.     }
  77.     else{
  78.         cout << "Existe solución";
  79.         // SACO LA SOLUCIÓN DE MI CAMINO (MUESTRO CADA VALOR DEL VECTOR)   
  80.         for_each(sol.begin(),sol.end(),[&](int i=0){cout << "-> " << sol[i];});
  81.         cout << endl;
  82.         return true;
  83.     }
  84. }
  85.  
  86.  
  87.  
  88.  
  89. int main(){ // COMPROBACIONES
  90. vector<int> solucion;
  91. int_2 grafin;
  92. grafin.resize(3,vector<int>(3));
  93. cout << "PRIMER GRAFO: TIENE QUE SALIR DE HAMILTON\n";
  94. grafin[0][0]=0; grafin[0][1]=1; grafin [0][2]=1;
  95. grafin[1][0]=1; grafin[1][1]=0; grafin [1][2]=1;
  96. grafin[2][0]=1; grafin[2][1]=1; grafin [2][2]=0;
  97. CicloHamilton(solucion,grafin);
  98. cout << "SEGUNDO GRAFO: NO TIENE QUE SALIR DE HAMILTON\n";
  99. grafin[0][0]=0; grafin[0][1]=0; grafin [0][2]=0;
  100. grafin[1][0]=0; grafin[1][1]=0; grafin [1][2]=0;
  101. grafin[2][0]=0; grafin[2][1]=0; grafin [2][2]=1;
  102. CicloHamilton(solucion,grafin);
  103. }