Esempio n. 1
0
        public DjikstraVertice EncontraVerticePorNome(string nome, List <DjikstraVertice> listaVertices)
        {
            DjikstraVertice vertice  = null;
            var             vertices = from vertex in listaVertices where vertex.Aeroporto == nome select vertex;

            if (vertices.Count() > 0)
            {
                vertice = vertices.First();
            }
            return(vertice);
        }
Esempio n. 2
0
        public List <Vertice> EncontraMelhorCaminho(string origem, string destino)
        {
            LimpaStatus();
            bool TodosVisitados = false;
            var  visitados      = new List <DjikstraVertice>();
            var  vOrigem        = EncontraVerticePorNome(origem);
            var  caminho        = new List <Vertice>();

            visitados.Add(new DjikstraVertice
            {
                Aeroporto = vOrigem.Aeroporto,
                Status    = Status.NOVO,
                Arestas   = CopiarArestas(vOrigem.Arestas),
                Distancia = 0
            });

            while (!TodosVisitados)
            {
                int count = visitados.Count;
                for (int i = 0; i < count; i++)
                {
                    foreach (var aresta in visitados[i].Arestas)
                    {
                        if (EncontraVerticePorNome(aresta.VerticeD, visitados) == null)
                        {
                            var auxVertice = EncontraVerticePorNome(aresta.VerticeD);
                            visitados.Add(new DjikstraVertice
                            {
                                Aeroporto  = aresta.VerticeD,
                                Arestas    = CopiarArestas(auxVertice.Arestas),
                                Status     = Status.VISITADO,
                                Distancia  = visitados[i].Distancia + aresta.Distancia,
                                VerticePai = visitados[i].Aeroporto
                            });
                        }
                        else
                        {
                            var auxDVertice = EncontraVerticePorNome(aresta.VerticeD, visitados);
                            var index       = visitados.IndexOf(auxDVertice);
                            if (visitados[index].Distancia > visitados[i].Distancia + aresta.Distancia)
                            {
                                visitados[index].Distancia  = visitados[i].Distancia + aresta.Distancia;
                                visitados[index].VerticePai = visitados[i].Aeroporto;
                            }
                        }
                    }
                    visitados[i].Status = Status.FINALIZADO;
                }

                TodosVisitados = (from vertice in visitados where vertice.Status == Status.FINALIZADO select vertice).Count() == visitados.Count ? true : false;
            }
            DjikstraVertice verticeAtual = EncontraVerticePorNome(destino, visitados);

            caminho.Add(verticeAtual);
            while (verticeAtual.VerticePai != origem)
            {
                verticeAtual = EncontraVerticePorNome(verticeAtual.VerticePai, visitados);
                caminho.Add(verticeAtual);
            }
            caminho.Add(vOrigem);
            caminho.Reverse();
            return(caminho);
        }