public void AplicarAlgoritmoDasEconomias() { var sede = Vertices.First(v => v.Identificador == "Sede"); var corAtual = Cores.First(c => c.Nome == "Vermelho"); const int distanciaMaxima = 30; var maiorCustoDeArestaParaASede = Arestas.Where(a => a.Antecessor == sede).OrderByDescending(a => a.Custo).First().Custo; var economias = ObterListaDeEconomias(); var verticesPassados = new List <Vertice>(); while (economias.Any()) { var economiaAtual = economias.First(); var valorTotalIndoEVoltandoParaSede = economiaAtual.ArestaJK.Custo * 2 + economiaAtual.ArestaKI.Custo * 2; var valorPegandoAtalho = economiaAtual.ArestaIJ.Custo + economiaAtual.ArestaJK.Custo + economiaAtual.ArestaKI.Custo; if (valorTotalIndoEVoltandoParaSede > valorPegandoAtalho) { CustoTotal += economiaAtual.ArestaIJ.Custo; economiaAtual.ArestaIJ.Cor = corAtual.Hexadecimal; if (verticesPassados.Contains(economiaAtual.ArestaIJ.Antecessor) || verticesPassados.Contains(economiaAtual.ArestaIJ.Sucessor)) { var verticeReferencia = verticesPassados.Contains(economiaAtual.ArestaIJ.Antecessor) ? economiaAtual.ArestaIJ.Antecessor : economiaAtual.ArestaIJ.Sucessor; var arestasASeremRemovidas = Arestas.Where(a => a.Antecessor == verticeReferencia || a.Sucessor == verticeReferencia); economias.RemoveAll(a => arestasASeremRemovidas.Contains(a.ArestaIJ)); } verticesPassados.Add(economiaAtual.ArestaIJ.Antecessor); verticesPassados.Add(economiaAtual.ArestaIJ.Sucessor); } else { CustoTotal += valorTotalIndoEVoltandoParaSede; economiaAtual.ArestaJK.Cor = corAtual.Hexadecimal; economiaAtual.ArestaKI.Cor = corAtual.Hexadecimal; var arestaJKContraria = Arestas.First(a => a.Antecessor == economiaAtual.ArestaJK.Sucessor && a.Sucessor == economiaAtual.ArestaJK.Antecessor); arestaJKContraria.Cor = corAtual.Hexadecimal; var arestaKIContraria = Arestas.First(a => a.Antecessor == economiaAtual.ArestaKI.Sucessor && a.Sucessor == economiaAtual.ArestaKI.Antecessor); arestaKIContraria.Cor = corAtual.Hexadecimal; } Economias.Add(economiaAtual); economias.Remove(economiaAtual); } }
public void PintarArestasDeIdaEVolta() { var arestasDaOrigem = Arestas.Where(a => a.Antecessor.Identificador == "Sede").ToList(); var corLaranja = Cores.First(c => c.Nome == "Laranja"); foreach (var aresta in arestasDaOrigem) { aresta.Cor = corLaranja.Hexadecimal; var arestaNova = new Aresta() { Codigo = Arestas.Last().Codigo + 1, Custo = aresta.Custo, Antecessor = aresta.Sucessor, Sucessor = aresta.Antecessor, Cor = corLaranja.Hexadecimal }; Arestas.Add(arestaNova); } }
private List <Economia> ObterListaDeEconomias() { var economias = new List <Economia>(); var sede = Vertices.First(v => v.Identificador == "Sede"); var arestasLigadasASede = Arestas.Where(a => a.Antecessor == sede || a.Sucessor == sede); foreach (var aresta in Arestas) { var i = aresta.Antecessor; var j = aresta.Sucessor; var arestasAPartirDaSede = arestasLigadasASede.Where(a => a.Antecessor == i || a.Sucessor == i || a.Antecessor == j || a.Sucessor == j); var economia = new Economia() { ArestaIJ = aresta, ArestaJK = arestasAPartirDaSede.First(a => a.Antecessor == j || a.Sucessor == j), ArestaKI = arestasAPartirDaSede.First(a => a.Antecessor == i || a.Sucessor == i) }; economias.Add(economia); } return(economias.OrderByDescending(e => e.Valor).ToList()); }
public Aresta ObtenhaAresta(int Id) { return(Arestas.Where(x => x.Id == Id).FirstOrDefault()); }
public Aresta ObtenhaAresta(int idOrigem, int idDestino) { return(Arestas.Where(x => x.Origem == idOrigem && x.Destino == idDestino).FirstOrDefault()); }
public Aresta GetAresta(int Id) { return(Arestas.Where((x) => x.Id == Id).FirstOrDefault()); }