public HashSet<AristaEj4> conflictos() throws Exception {
   HashSet<AristaEj4> res = new HashSet<AristaEj4>();
   for (NodoConVecinos n : this._vecinos) {
     if (n.getColor() == this.getColor()) res.add(new AristaEj4(n, this));
   }
   return res;
 }
 public int cantConflictos() { // Total: O(cantidad de vecinos), que es O(n)
   Integer res = 0; // O(1)
   for (NodoConVecinos n : this._vecinos) { // O(n) iteraciones
     if (n.getColor() == this.getColor()) // O(1)
     res += 1; // O(1)
   }
   return res; // O(1)
 }
 public LinkedList<NodoConVecinos> posiblesSwaps() { // total: O(n*c)
   LinkedList<NodoConVecinos> res = new LinkedList<NodoConVecinos>(); // O(1)
   for (NodoConVecinos n : this._vecinos) { // O(n) iteraciones.
     if (n.getColor() != this.getColor()) { // O(1)
       if ((n.get_coloresPosibles().contains(this.getColor()))
           && this.get_coloresPosibles().contains(n.getColor())) // O(c)
       res.add(n); // O(1)
     }
   }
   return res; // O(1)
 }
  public Hashtable<Integer, ArrayList<NodoConVecinos>> conflictosPorColor() { // O(n)
    Hashtable<Integer, ArrayList<NodoConVecinos>> conflictosPorColor =
        new Hashtable<Integer, ArrayList<NodoConVecinos>>(); // O(1)

    for (int color : this.get_coloresPosibles()) { // O(c)
      ArrayList<NodoConVecinos> vacia = new ArrayList<NodoConVecinos>();
      conflictosPorColor.put(color, vacia);
    }

    for (NodoConVecinos v : this.vecinos()) { // O(n) iteraciones
      if (conflictosPorColor.containsKey(v.getColor())) { // O(c)  pero amortiza a O(1)
        ArrayList<NodoConVecinos> nuevovalor = conflictosPorColor.get(v.getColor());
        nuevovalor.add(v);
        conflictosPorColor.put(v.getColor(), nuevovalor);
      }
    }

    return conflictosPorColor;
  }
  public Swap buscarMejorSwap() { // O(n*c + n*n)
    LinkedList<NodoConVecinos> candidatos = this.posiblesSwaps(); // O(n*c)
    NodoConVecinos mejorSwap = null; // O(1)
    int mejorMejora = 0; // O(1)																
    int conflictosPropios = this.cantConflictos(); // O(n)
    for (NodoConVecinos v : candidatos) { // O(n) iteraciones. Total: O(n*n)
      int conflictosSinSwap = conflictosPropios + v.cantConflictos(); // O(n)
      this.swapColor(v); // hago swap de colores (sin cambiar otras estructuras). O(1)
      int conflictosConSwap = this.cantConflictos() + v.cantConflictos(); // O(n)
      this.swapColor(v); // revierto el swap de colores					O (1)

      if (conflictosConSwap < conflictosSinSwap) { // O(1)
        if ((conflictosSinSwap - conflictosConSwap) > mejorMejora) { // O(1)
          mejorSwap = v; // O(1)
          mejorMejora = conflictosSinSwap - conflictosConSwap; // O(1)
        }
      }
    }
    return new Swap(mejorSwap, mejorMejora);
  }
 private void swapColor(NodoConVecinos otro) {
   int otroColor = otro.getColor();
   otro.setColor(this.getColor());
   this.setColor(otroColor);
 }