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); }
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); }