private void EncontrarCaminhoMinimo(double[,] matriz, Grafo grafo, string vx, string vy) { var x = grafo.GetVertice(vx); var y = grafo.GetVertice(vy); tbMain.AppendText($"Encontrando caminho do vértice {x} ao vértice {y}..." + Environment.NewLine); List <Vertice> _IN; Vertice p; var d = new double[grafo.Vertices.Count]; var s = new Vertice[grafo.Vertices.Count]; _IN = new List <Vertice>() { x }; d[grafo.GetIndice(x)] = 0; foreach (Vertice z in grafo.Vertices.Where(z => !_IN.Contains(z))) { d[grafo.GetIndice(z)] = matriz[grafo.GetIndice(x), grafo.GetIndice(z)]; s[grafo.GetIndice(z)] = x; } while (!_IN.Contains(y)) { p = grafo.Vertices.Where(z => !_IN.Contains(z)).OrderBy(z => d[grafo.GetIndice(z)]).First(); _IN.Add(p); foreach (Vertice z in grafo.Vertices.Where(z => !_IN.Contains(z))) { var distAnterior = d[grafo.GetIndice(z)]; d[grafo.GetIndice(z)] = Math.Min(d[grafo.GetIndice(z)], d[grafo.GetIndice(p)] + matriz[grafo.GetIndice(p), grafo.GetIndice(z)]); if (!(d[grafo.GetIndice(z)] == distAnterior)) { s[grafo.GetIndice(z)] = p; } } } //exibir if (d[grafo.GetIndice(y)] == Double.PositiveInfinity) { tbMain.AppendText(Environment.NewLine + "Não há caminho entre esses dois vértices."); } else { var caminho = new List <string>(); tbMain.AppendText(Environment.NewLine + "Em ordem inversa, o caminho é:" + Environment.NewLine); tbMain.AppendText(y + Environment.NewLine); var _z = y; caminho.Add(_z.Nome); while (_z != x) { var sz = s[grafo.GetIndice(_z)]; tbMain.AppendText(sz + Environment.NewLine); caminho.Add(sz.Nome); _z = sz; } caminho.Reverse(); tbMain.AppendText(Environment.NewLine + "O caminho, na ordem certa, é:" + Environment.NewLine); caminho.ForEach(v => tbMain.AppendText(v + Environment.NewLine)); tbMain.AppendText(Environment.NewLine + $"A distância do caminho é: {d[grafo.GetIndice(y)]}"); } }