예제 #1
0
 /// <summary>
 /// Construtor padrão
 /// </summary>
 /// <param name="pDfs"></param>
 public LeitorXml()
 {
     grafo = new Grafo();
 }
예제 #2
0
 public Vertice(int id, String nome, Grafo grafo)
 {
     this.Id_v  = id;
     this.Nome  = nome;
     this.Grafo = grafo;
 }
예제 #3
0
        static void Main(string[] args)
        {
            Grafo  grafo = null;
            int    i;
            String op;

            System.Console.Write(":::::::::: GRAFOS ::::::::::\n\n");
            System.Console.Write("1)Dririgido\n2)No dirigido\n3)Salir\n");
            op = System.Console.ReadLine();
            if (op == "1")
            {
                grafo = new Grafo(true);
            }
            else if (op == "2")
            {
                grafo = new Grafo(false);
            }
            while (op != "9")
            {
                System.Console.Write(":::::::::: GRAFOS ::::::::::\n\n");
                System.Console.Write("1) Agregar Vertice\n2) Agregar Arista\n3) Eliminar Vertice\n4) Eliminar Arista\n");
                System.Console.Write("5) Dijkstra\n6) Kruskal\n7) Prim\n8) Floyd\n9) Salir\n");
                op = System.Console.ReadLine();
                switch (op)
                {
                case "1":
                    grafo.agregaV();
                    System.Console.Read();
                    break;

                case "2":
                    if (grafo.numver < 1)
                    {
                        System.Console.Write("No hay vertices, no se puede agregar aristas");
                    }
                    else
                    {
                        System.Console.Write("Vertices existentes\n\n");
                        for (i = 0; i < grafo.numver; i++)
                        {
                            System.Console.Write("[" + grafo.verts[i] + "]");
                        }
                        grafo.agregaA();
                    }
                    System.Console.Read();
                    break;

                case "5":
                    if (grafo.numver == 0)
                    {
                        System.Console.Write("No hay ningun vertice agregado");
                    }
                    else
                    {
                        if (grafo.numaris == 0)
                        {
                            System.Console.Write("No hay ninguna arista agregada");
                        }
                        else
                        {
                            grafo.dijkstra();
                        }
                    }
                    System.Console.Read();
                    break;
                }
            }
            op = "";
        }
예제 #4
0
        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)]}");
            }
        }