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