예제 #1
0
  /**
   * Pone una arista en el grafo que incidirá en los vértices idOrigen y idDestino. Si ya hay una,
   * la sustituye.
   *
   * @param idOrigen Identificador de un vértice.
   * @param idDestino Identificador de un vértice.
   * @param arista Arista que se va a añadir al grafo.
   */
  private void ponerArista(int idOrigen, int idDestino, Arista arista)
      throws IllegalArgumentException {
    if (!(this.existeIdVertice(idOrigen) && this.existeIdVertice(idDestino))) {
      throw new IllegalArgumentException("Error al poner una arista: algún vértice no existe.");
    }
    if (idOrigen == idDestino) {
      throw new IllegalArgumentException(
          "Error al poner una arista: deben ser identificadores diferentes.");
    }
    if (!this.adyacentes(idOrigen, idDestino)) {
      this.aumentarGrado(idOrigen);
      this.aumentarGrado(idDestino);
    }
    // Actualizar matriz de adyacencia
    arista.modificarOrigen(idOrigen);
    arista.modificarDestino(idDestino);
    this.matrizAdyacencias.get(idOrigen).set(idDestino, arista);
    Arista inv = new Arista(arista);
    inv.modificarOrigen(idDestino);
    inv.modificarDestino(idOrigen);
    this.matrizAdyacencias.get(idDestino).set(idOrigen, inv);
    // Actualizar listas de adyacencias
    ArrayList<Vertice<T>> listAdyOri = this.listasAdyacencias.get(idOrigen);
    ArrayList<Vertice<T>> listAdyDest = this.listasAdyacencias.get(idDestino);
    Vertice origen = this.vertice(idOrigen);
    Vertice destino = this.vertice(idDestino);
    if (!listAdyOri.contains(destino)) {
      listAdyOri.add(destino);
    }
    if (!listAdyDest.contains(origen)) {
      listAdyDest.add(origen);
    }

    this.nAristas++;
  }
예제 #2
0
  /**
   * Devuelve cierto si las aristas conectan todos los vértices del grafo. Falso en caso contrario.
   *
   * @param aristas Las aristas.
   * @return Cierto si las aristas conectan todos los vértices del grafo. Falso en caso contrario.
   */
  public boolean conectaTodosVertices(ArrayList<Arista> aristas) throws IllegalArgumentException {
    ArrayList<Vertice> V = new ArrayList<>();
    int visitados = 0;
    for (int i = 0; i < aristas.size() && visitados < this.nVertices; i++) {
      Arista a = aristas.get(i);
      if (a == null) {
        throw new IllegalArgumentException(
            "Error al comprobar arista: referencia nula a la arista.");
      }
      int idOrigen = a.origen();
      int idDestino = a.destino();
      if (idOrigen == idDestino) {
        throw new IllegalArgumentException(
            "Error al comprobar arista: la arista tiene el mismo origen y destino.");
      }
      if (!(this.existeIdVertice(idOrigen) && this.existeIdVertice(idDestino))) {
        throw new IllegalArgumentException("Error al comprobar arista: algún vértice no existe.");
      }

      Vertice v1 = this.vertice(idOrigen);
      Vertice v2 = this.vertice(idDestino);
      if (!V.contains(v1)) {
        V.add(v1);
        visitados++;
      }
      if (!V.contains(v2)) {
        V.add(v2);
        visitados++;
      }
    }
    return visitados == this.nVertices;
  }
예제 #3
0
  public int CalcularTiempoDeInfeccion(Grafo<String> grafo, Vertice<String> in) {
    int nuevaDist = 0;
    int maxDist = 0;
    int n = grafo.listaDeVertices().tamanio();
    int[] distancias = new int[n];
    ColaGenerica<Vertice<String>> q = new ColaGenerica<Vertice<String>>();
    for (int c = 0; c < n; c++) {
      distancias[c] = Integer.MAX_VALUE;
    }
    distancias[in.posicion()] = 0;
    q.encolar(in);
    while (!q.esVacia()) {
      Vertice<String> v = q.desencolar();
      nuevaDist = distancias[v.posicion()] + 1;
      ListaGenerica<Arista<String>> ady = grafo.listaDeAdyacentes(v);
      ady.comenzar();
      while (!ady.fin()) {
        Arista<String> a = ady.proximo();
        if (distancias[a.verticeDestino().posicion()] == Integer.MAX_VALUE) {
          q.encolar(a.verticeDestino());
          distancias[a.verticeDestino().posicion()] = nuevaDist;
          if (nuevaDist > maxDist) {
            maxDist = nuevaDist;
          }
        }
      }
    }

    return maxDist;
  }
예제 #4
0
 @SuppressWarnings("SleepWhileHoldingLock")
 @Override
 public void run() {
   for (Arista actual : arbol.aristasB) {
     try {
       actual.marcar(lienzo.getGraphics());
       sleep(arbol.getVel());
     } catch (InterruptedException ex) {
       ex.printStackTrace();
     }
   }
   try {
     sleep(100);
   } catch (InterruptedException ex) {
   }
   arbol.aristasB.clear();
   dialog(c[0], c[1]);
 }
예제 #5
0
 /**
  * Pone una arista en el grafo que incidirá en los vértices arista.origen() y arista.destino(). Si
  * ya hay una, la sustituye.
  *
  * @param arista Arista que se va a añadir al grafo.
  */
 public void ponerArista(Arista arista) throws IllegalArgumentException {
   if (!(this.existeIdVertice(arista.origen()) && this.existeIdVertice(arista.destino()))) {
     throw new IllegalArgumentException("Error al poner una arista: algún vértice no existe.");
   }
   if (arista.origen() == arista.destino()) {
     throw new IllegalArgumentException(
         "Error al poner una arista: deben ser identificadores diferentes.");
   }
   this.ponerArista(arista.origen(), arista.destino(), arista);
 }