//Retorna o elemento da aresta public int removerAresta(Aresta aresta) { aresta.origem.arestas.Remove(aresta); aresta.destino.arestas.Remove(aresta); arestas.Remove(aresta); return(aresta.peso); }
/*O(log(n))*/ public void Add(Aresta aresta) { this.expandirArestas(); arestas[proximoElemento] = aresta; this.upHeap(proximoElemento); proximoElemento++; }
/*O(n)*/ public void Remove(Aresta aresta) { if (proximoElemento-- == 0) { throw new HeapException("A Heap está vazia"); } int posicao = 0; for (; posicao <= proximoElemento; posicao++) { if (arestas[posicao].Equals(aresta)) { break; } } if (posicao > proximoElemento) { throw new HeapException("Elemento não encontrado"); } if (proximoElemento != 0) { arestas[posicao] = arestas[proximoElemento]; if (arestas[posicao].peso > aresta.peso) { downHeap(posicao); } else if (arestas[posicao].peso < aresta.peso) { upHeap(posicao); } } }
public ArestaComposta(Vertice origemAresta, Vertice destinoAresta, Aresta arestaSimples) { peso = arestaSimples.peso; origem = origemAresta; destino = destinoAresta; caminho = new List <Aresta>(); caminho.Add(arestaSimples); }
/*O(n)*/ public Aresta[] ToArray() { Aresta[] retorno = new Aresta[proximoElemento]; for (int i = 0; i < proximoElemento; i++) { retorno[i] = arestas[i]; } return(retorno); }
/*O(n)*/ private void expandirArestas() { if (proximoElemento == tamanho) { tamanho *= 2; Aresta[] aux = arestas; arestas = new Aresta[tamanho]; for (int i = 0; i < proximoElemento; i++) { arestas[i] = aux[i]; } } }
/*O(log(n))*/ public Aresta Remove() { if (proximoElemento == 0) { throw new HeapException("A Heap está vazia"); } Aresta retorno = arestas[0]; arestas[0] = arestas[--proximoElemento]; arestas[proximoElemento] = null; this.downHeap(); return(retorno); }
//Retorna a nova aresta; O elemento é da aresta public Aresta inserirAresta(Vertice origem, Vertice destino, int peso = 0) { if (peso < 0) { peso = 0; } Aresta a = new Aresta(origem, destino, peso); arestas.Add(a); origem.arestas.Add(a); destino.arestas.Add(a); return(a); }
public Heap() { proximoElemento = 0; tamanho = 16; arestas = new Aresta[tamanho]; }
public ArestaComposta(Vertice origem, Vertice destino, int peso = int.MaxValue, Aresta aresta = null) : base(origem, destino, peso) { this.peso = peso; this.origem = origem; this.destino = destino; this.caminho = new List <Aresta>(); if (aresta != null && aresta.GetType().Equals(this)) //se for uma aresta composta { this.caminho = ((ArestaComposta)aresta).caminho; } else if (aresta != null) { caminho.Add(aresta); } }
//Substitui o elemento armazenado no vértice "vertice" por "novoElemento" public void substituir(Aresta aresta, int novoPeso) { aresta.peso = novoPeso; }