コード例 #1
0
ファイル: CaminhoMinimo.cs プロジェクト: antoniogott/Grafos
        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)]}");
            }
        }