public virtual void AdicionaNo(No n) { if (!nos.ContainsKey(n.Chave)) nos.Adiciona(n); else throw new ArgumentException("Já existe um nó no Grafo com a chave " + n.Chave); }
public virtual void AdicionaAdjacenciaInd(No n1, No n2, int custo) { if (nos.ContainsKey(n1.Chave) && nos.ContainsKey(n2.Chave)) { n1.DirecionarNovo(n2, custo); n2.DirecionarNovo(n1, custo); } else throw new ArgumentException("Um dos nós não está no Grafo"); }
public virtual No AdicionaNo(string chave, object dados) { if (!nos.ContainsKey(chave)) { No n = new No(chave, dados); nos.Adiciona(n); return n; } else throw new ArgumentException("Ja existe um nó no Grafo com a chave " + chave); }
public void AdicionaRota(int origem, int destino) { AeroportoItem aero1 = getAeroporto(origem); AeroportoItem aero2 = getAeroporto(destino); int distanciaE = DistanciaEntre(aero1, aero2); No no1 = new No(aero1.Name, null); No no2 = new No(aero2.Name, null); if (!Mapa.Contem(aero1.Name)) Mapa.AdicionaNo(no1); if (!Mapa.Contem(aero2.Name)) Mapa.AdicionaNo(no2); Mapa.AdicionaAdjacenciaInd(aero1.Name, aero2.Name, distanciaE); }
private void AtualizaDistancia(No n1, No n2, int custo) { int distanciaN1 = (int)distancia[n1.Chave]; int distanciaN2 = (int)distancia[n2.Chave]; if (distanciaN2 > distanciaN1 + custo) { distancia[n2.Chave] = distanciaN1 + custo; rotas[n2.Chave] = n1; } }
public int NVizinhos(int aeroporto) { AeroportoItem aero1 = getAeroporto(aeroporto); No no1 = new No(aero1.Name, null); foreach(No n in Mapa.Nos) { if (n.Chave == no1.Chave) no1 = n; } return no1.NumeroVizinhos(); }
public Tuple<int, List<string>> Dijkstra(string comeco, string fim) { int distanciaPercorrida = 0; List<string> lugaresVisitados = new List<string>(); try { InicializaRotas(comeco); NoLista nos = Mapa.Nos; string visitados = ""; while (nos.Count > 0) { No u = MenorCaminho(nos); nos.Remover(u); foreach (BordaPVizinho borda in u.Vizinhos) { AtualizaDistancia(u, borda.Vizinho, borda.Custo); } } Int32.TryParse(distancia[fim].ToString(), out distanciaPercorrida); Stack tracarDeVolta = new Stack(); No atual = new No(fim, null); No anterior = null; do { anterior = atual; atual = (No)rotas[anterior.Chave]; string temporaria = atual.Chave + " até " + anterior.Chave + "\n"; tracarDeVolta.Push(temporaria); } while (atual.Chave != comeco); StringBuilder sb = new StringBuilder(30 * tracarDeVolta.Count); while (tracarDeVolta.Count > 0) { lugaresVisitados.Add((String)tracarDeVolta.Pop()); } visitados = sb.ToString(); } catch(Exception e) { lugaresVisitados.Add("Erro no banco de dados."); lugaresVisitados.Add("Não foi possível abrir o arquivo."); lugaresVisitados.Add("Tente reiniciar a aplicação."); lugaresVisitados.Add(e.Message.ToString()); lugaresVisitados.Add(e.Data.ToString()); } Tuple<int,List<string>> retorno = new Tuple<int, List<string>>(distanciaPercorrida, lugaresVisitados); return retorno; }
public virtual bool Contem(No n) { return Contem(n.Chave); }
public virtual void RemoveAdjacencia(No n1, No n2, int custo) { if (nos.ContainsKey(n1.Chave) && nos.ContainsKey(n2.Chave)) { n1.Remover(n2, custo); n2.Remover(n1, custo); } else throw new ArgumentException("Um dos nós não está no Grafo"); }
public BordaPVizinho(No vizinho, int custo) { this.custo = custo; this.vizinho = vizinho; }
public BordaPVizinho(No vizinho) : this(vizinho, 0) { }
protected internal virtual void Remover(No n, int custo) { Remover(new BordaPVizinho(n, custo)); }
protected internal virtual void DirecionarNovo(No n, int custo) { DirecionarNovo(new BordaPVizinho(n, custo)); }
protected internal virtual void DirecionarNovo(No n) { DirecionarNovo(new BordaPVizinho(n)); }