コード例 #1
0
ファイル: Grafo.cs プロジェクト: diogobernini/VoeAzul
 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);
 }
コード例 #2
0
ファイル: Grafo.cs プロジェクト: diogobernini/VoeAzul
 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");
 }
コード例 #3
0
ファイル: Grafo.cs プロジェクト: diogobernini/VoeAzul
 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);
 }
コード例 #4
0
ファイル: Aeroporto.cs プロジェクト: diogobernini/VoeAzul
 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);
 }
コード例 #5
0
ファイル: Aeroporto.cs プロジェクト: diogobernini/VoeAzul
 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;
     }
 }
コード例 #6
0
ファイル: Aeroporto.cs プロジェクト: diogobernini/VoeAzul
 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();
 }
コード例 #7
0
ファイル: Aeroporto.cs プロジェクト: diogobernini/VoeAzul
        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;
        }
コード例 #8
0
ファイル: Grafo.cs プロジェクト: diogobernini/VoeAzul
 public virtual bool Contem(No n)
 {
     return Contem(n.Chave);
 }
コード例 #9
0
ファイル: Grafo.cs プロジェクト: diogobernini/VoeAzul
 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");
 }
コード例 #10
0
ファイル: BordaPVizinho.cs プロジェクト: diogobernini/VoeAzul
 public BordaPVizinho(No vizinho, int custo)
 {
     this.custo = custo;
     this.vizinho = vizinho;
 }
コード例 #11
0
ファイル: BordaPVizinho.cs プロジェクト: diogobernini/VoeAzul
 public BordaPVizinho(No vizinho)
     : this(vizinho, 0)
 {
 }
コード例 #12
0
ファイル: No.cs プロジェクト: diogobernini/VoeAzul
 protected internal virtual void Remover(No n, int custo)
 {
     Remover(new BordaPVizinho(n, custo));
 }
コード例 #13
0
ファイル: No.cs プロジェクト: diogobernini/VoeAzul
 protected internal virtual void DirecionarNovo(No n, int custo)
 {
     DirecionarNovo(new BordaPVizinho(n, custo));
 }
コード例 #14
0
ファイル: No.cs プロジェクト: diogobernini/VoeAzul
 protected internal virtual void DirecionarNovo(No n)
 {
     DirecionarNovo(new BordaPVizinho(n));
 }