Exemplo n.º 1
0
        void encontrarCamino(Vertice origen, Vertice destino)
        {
            listaCamino.Add(destino);              //< Añado el vertice destino, la lista empieza al reves

            Vertice temp = destino;                //< Iterador en la lista

            while (temp.getId() != origen.getId()) //< Mientras el Id del temporal no sea el del origen
            {
                foreach (elementoDij e_d in elementoDList)
                {
                    if (e_d.getVEDJ() == temp)                     // Busco el elementoDij que lo contiene y lo añado al camino y muevo el temporal
                    {
                        listaCamino.Add(e_d.getProv());
                        temp = e_d.getProv();
                        break;
                    }
                }
            }
            listaCamino.Reverse();             //< Le doy la vuelta a la lista para que esten en orden
        }
Exemplo n.º 2
0
        void ButtonPRIMClick(object sender, EventArgs e)
        {
            numericUpPRIM.Maximum = graf.getLV().Count;
            Vertice origen = new Vertice();

            int vertice = 0;

            vertice = (int)numericUpPRIM.Value;

            foreach (Vertice v in graf.getLV())
            {
                if (v.getId() == vertice)
                {
                    origen = v;
                    break;
                }
            }
            //KruskalPrim prim = new KruskalPrim(graf, imgGrafo);
            hazPrim(origen);             //Falta vertice origen
        }
Exemplo n.º 3
0
 public void setVertice(Vertice v)
 {
     this.vertice = v;
 }
Exemplo n.º 4
0
 public void setVerticeProv(Vertice v)
 {
     this.proveniente = v;
 }
Exemplo n.º 5
0
        void animarParticulas()
        {
            if (!esDijk)
            {
                bool     vuelta   = false;
                int      vueltas  = 0;
                Graphics graphics = Graphics.FromImage(iTransp);
                Brush    brochaP  = new SolidBrush(Color.BlueViolet);
                Brush    brochaD  = new SolidBrush(Color.Gold);
                Point    point    = new Point();

                Particula p = new Particula();
                while (lParticulas.Count > 0)
                {
                    if (vueltas == 2)
                    {
                        vuelta = true;
                    }
                    for (int i = 0; i < lParticulas.Count; i++)
                    {
                        p = lParticulas[i];
                        p.setIndPos(p.getContador());

                        Arista  a   = new Arista();
                        Vertice ori = p.getLVertices()[p.getCOri()];
                        Vertice des = p.getLVertices()[p.getCDes()];
                        for (int j = 0; j < ori.getLA().Count; j++)
                        {
                            if (ori.getLA()[j].getDestino().getId() == des.getId())
                            {
                                a = ori.getLA()[j];
                                break;
                            }
                        }

                        if (p.getIndPos() < a.getListaP().Count)                         //Si la particula no ha terminado los puntos en la arista donde esta
                        {
                            Point po = a.getListaP()[p.getIndPos()];
                            if (p.esDepre() == true)
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaD, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            else
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaP, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            //COMPROBAR COLISIONES
                            if (vuelta)
                            {
                                Particula p1 = new Particula();
                                Particula p2 = new Particula();

                                for (int z = 0; z < lParticulas.Count; z++)
                                {
                                    for (int x = 0; x < lParticulas.Count; x++)
                                    {
                                        if (z < lParticulas.Count && x < lParticulas.Count)
                                        {
                                            p1 = lParticulas[z];                                             // Es depredadora
                                            p2 = lParticulas[x];                                             // Es presa
                                        }

                                        if (p1.esDepre() && !p2.esDepre())
                                        {
                                            if (p1.getPosActual() == p2.getPosActual() ||
                                                (p1.getPosActual().X - 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||                                           //Aqui ya captura en x lineal
                                                (p1.getPosActual().X - 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||

                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 4 == p2.getPosActual().Y) ||                                           //Aqui ya captura en Y lineal
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 4 == p2.getPosActual().Y) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X)
                                                )
                                            {
                                                p1.setR(p1.getR() + 5);
                                                lParticulas.Remove(p2);
                                                //i--;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else                           //si ya termino cambio el origen
                        {
                            p.setCOri(p.getCOri() + 1);
                            p.setCDes(p.getCDes() + 1);
                            p.setContador(0);
                            if (p.getCDes() == p.getLVertices().Count)                             //Si el destino es el ultimo en la lista elimino la particula
                            {
                                point.X = 0;
                                point.Y = 0;
                                p.setPosActual(point);
                                lParticulas.Remove(p);
                                i--;
                            }
                        }
                        p.setContador(p.getContador() + 5);
                    }
                    pictureImageGrafo.Refresh();
                    graphics.Clear(Color.Transparent);
                    vueltas++;
                }
                totalVertices = disponibles = g.getLV().Count;                 //< Reinicio el contador para insertar más
                vOcupados.Clear();
            }
            else
            {
                bool vuelta  = false;
                bool viva    = true;
                bool refresh = true;
                int  vueltas = 0;
                //labelLlego.Text = "--";
                Graphics graphics = Graphics.FromImage(iTransp);
                Brush    brochaP  = new SolidBrush(Color.BlueViolet);
                Brush    brochaD  = new SolidBrush(Color.Gold);
                Point    point    = new Point();

                Particula p = new Particula();
                while (lParticulas.Count > 0)
                {
                    if (vueltas == 2)
                    {
                        vuelta = true;
                    }
                    if (!viva)
                    {
                        MessageBox.Show("-=LA PARTICULA FUE DEVORADA=-");
                        totalVertices = disponibles = g.getLV().Count;                         //< Reinicio el contador para insertar más
                        vOcupados.Clear();
                        break;
                    }
                    for (int i = 0; i < lParticulas.Count; i++)
                    {
                        p = lParticulas[i];
                        p.setIndPos(p.getContador());

                        Arista  a   = new Arista(null, null, double.MaxValue, null);
                        Vertice ori = p.getLVertices()[p.getCOri()];
                        Vertice des = p.getLVertices()[p.getCDes()];

                        for (int j = 0; j < ori.getLA().Count; j++)
                        {
                            if (ori.getLA()[j].getDestino() == des)
                            {
                                a = ori.getLA()[j];
                                break;
                            }
                        }

                        if (p.getIndPos() < a.getListaP().Count)                         //Si la particula no ha terminado los puntos en la arista donde esta
                        {
                            Point po = a.getListaP()[p.getIndPos()];
                            if (p.esDepre() == true)
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaD, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            else
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaP, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            //COMPROBAR COLISIONES
                            if (vuelta)
                            {
                                Particula p1 = new Particula();
                                Particula p2 = new Particula();

                                for (int z = 0; z < lParticulas.Count; z++)
                                {
                                    for (int x = 0; x < lParticulas.Count; x++)
                                    {
                                        if (z < lParticulas.Count && x < lParticulas.Count)
                                        {
                                            p1 = lParticulas[z];                                             // Es depredadora
                                            p2 = lParticulas[x];                                             // Es presa
                                        }

                                        if (p1.esDepre() && !p2.esDepre())
                                        {
                                            if (p1.getPosActual() == p2.getPosActual() ||
                                                (p1.getPosActual().X - 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||                                           //Aqui ya captura en x lineal
                                                (p1.getPosActual().X - 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||

                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 4 == p2.getPosActual().Y) ||                                           //Aqui ya captura en Y lineal
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 4 == p2.getPosActual().Y) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X))
                                            {
                                                p1.setR(p1.getR() + 5);
                                                lParticulas.Clear();
                                                //TODO: Si se comieron la presa detengo todo el proceso
                                                numericUpPosPresa.Enabled = true;
                                                viva = false;
                                                MessageBox.Show("-=LA PARTICULA FUE DEVORADA=-");
                                                totalVertices = disponibles = g.getLV().Count;                                                 //< Reinicio el contador para insertar más
                                                vOcupados.Clear();
                                                pictureImageGrafo.Refresh();
                                                graphics.Clear(Color.Transparent);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else                           //si ya termino cambio el origen
                        {
                            p.setCOri(p.getCOri() + 1);
                            p.setCDes(p.getCDes() + 1);
                            p.setContador(0);
                            int auxPos = p.getLVertices()[p.getCDes() - 1].getId();
                            if (p.getCDes() == p.getLVertices().Count)                             //Si el destino es el ultimo en la lista elimino la particula
                            {
                                point.X = 0;
                                point.Y = 0;
                                p.setPosActual(point);
                                lParticulas.Clear();

                                //TODO: Si llego al final el vertice final será el nuevo origen, deberia cambiar los numericUp
                                viva = false;
                                //MessageBox.Show("La presa llego a su destino, seleccione uno nuevo");
                                numericUpPosPresa.Value   = auxPos;
                                numericUpPosPresa.Enabled = false;
                                refresh = false;
                                MessageBox.Show("-=LA PARTICULA LLEGO A SU DESTINO=-");
                                totalVertices = disponibles = g.getLV().Count;                                 //< Reinicio el contador para insertar más
                                vOcupados.Clear();

                                buttonDepre.Enabled = false;
                            }
                        }
                        p.setContador(p.getContador() + 5);
                    }
                    if (refresh)
                    {
                        pictureImageGrafo.Refresh();
                        graphics.Clear(Color.Transparent);
                    }
                    vueltas++;
                }
            }
        }
Exemplo n.º 6
0
        private void rAmplitudCompleto(Vertice origen)
        {
            Queue <Vertice> cola = new Queue <Vertice>();

            camino = new List <Vertice>();
            Vertice [] provenientes = new Vertice[graf.getLV().Count + 1];

            List <Vertice> visitados = new List <Vertice>();           //Para cada deprededadora

            cola.Enqueue(origen);
            visitados.Add(origen);
            //provenientes[x] = new Vertice();
            provenientes[origen.getId() - 1] = null;


            Vertice v_o    = new Vertice();
            Vertice v_d    = new Vertice();
            Vertice auxv_o = new Vertice();
            Vertice auxv_d;            // = new Vertice();

            List <Vertice>  camino1 = new List <Vertice>();
            List <Vertice>  camino2 = new List <Vertice>();
            Stack <Vertice> pilaAux = new Stack <Vertice>();

            while (visitados.Count != graf.getLV().Count)
            {
                foreach (Arista a_i in origen.getLA())
                {
                    Vertice dest = a_i.getDestino();

                    if (!visitados.Contains(dest))
                    {
                        cola.Enqueue(dest);
                        visitados.Add(dest);
                        provenientes[dest.getId()] = origen;

                        while (auxv_o != null)
                        {
                            if (provenientes[auxv_o.getId()] != null)
                            {
                                camino1.Add(provenientes[auxv_o.getId()]);
                            }
                            auxv_o = provenientes[auxv_o.getId()];
                        }
                        auxv_d = dest;
                        while (provenientes[auxv_d.getId()] != null)
                        {
                            pilaAux.Push(provenientes[auxv_d.getId()]);
                            auxv_d = provenientes[auxv_d.getId()];
                        }
                        while (pilaAux.Count != 0)                         //Voltea el camino
                        {
                            camino2.Add(pilaAux.Pop());
                        }
                        //solo si existen dos caminos
                        if (camino1.Count != 0)
                        {
                            if (camino2.Count != 0)
                            {
                                camino.AddRange(combinaCaminos(camino1, camino2));
                            }
                            else
                            {
                                camino.AddRange(camino1);
                            }
                        }
                        else
                        {
                            camino.AddRange(camino2);
                        }
                        camino.Add(dest);                        //Add
                        camino1.Clear();
                        camino2.Clear();
                        auxv_o = auxv_d;
                    }
                }
                cola.Dequeue();
                origen = cola.First();
            }
        }
Exemplo n.º 7
0
        public List <Vertice> getRecorridoProfundidad(Vertice origen)
        {
            recorridoProfundidad(origen);

            return(recorrido);
        }
Exemplo n.º 8
0
 public List <Vertice> getRecorridoAmplitud(Vertice origen)
 {
     rAmplitudCompleto(origen);
     rAmptermina();
     return(camino);
 }
Exemplo n.º 9
0
        public void insertaArista(Vertice destino, Vertice origen, double distanciaA, List <Point> lpo)
        {
            Arista a = new Arista(destino, origen, distanciaA, lpo);

            la.Add(a);
        }
Exemplo n.º 10
0
        void hazPrim(Vertice origen)
        {
            double pesoTotal = 0;

            bmpGrafo = new Bitmap(imgGrafo);
            List <Arista>  C         = new List <Arista>(graf.getLA()); //< Candidatos, con la lista de aristas
            List <Arista>  PSolucion = new List <Arista>();             //< Solucion con las posibles aristas
            List <Vertice> visitados = new List <Vertice>();            //< Vertices que ya fueron visitados

            visitados.Add(origen);

            if (C.Count == 0)
            {
                return;
            }

            C.Sort(
                delegate(Arista p1, Arista p2)
            {
                return(p1.getDistancia().CompareTo(p2.getDistancia()));
            }
                );

            while (visitados.Count < graf.getLV().Count)
            {
                Arista a = new Arista();

                a = aristaSaliente(visitados, C);                 //Me regresa la arista menor
                //Si me regresa una arista dummy es porque termino una isla y no hay más vertices
                if (a.getDistancia() == double.MaxValue)
                {
                    visitados.Add(buscarIsla(visitados, C));                     //Busco una "isla", que me regresa un vertice y lo añado a visitadis
                    continue;
                }
                PSolucion.Add(a);                // Añado a mi solucion la arista
                //Añado el vertice de la arista dependiendo de cual haga falta
                if (visitados.Contains(a.getOrigen()))
                {
                    visitados.Add(a.getDestino());
                }
                else
                {
                    visitados.Add(a.getOrigen());
                }
            }

            //Dibujo las aristas de un color diferente y sumo las distancias de todas mis aristas para marcar el peso total del arbol
            Graphics gra   = Graphics.FromImage(bmpGrafo);
            Pen      lapiz = new Pen(Color.Blue, 10);

            for (int i = 0; i < PSolucion.Count; i++)
            {
                try{
                    gra.DrawLine(lapiz, PSolucion[i].getOrigen().getCircle().getP().X, PSolucion[i].getOrigen().getCircle().getP().Y, PSolucion[i].getDestino().getCircle().getP().X, PSolucion[i].getDestino().getCircle().getP().Y);
                }catch (Exception ex) {}
            }

            foreach (Arista a in PSolucion)
            {
                pesoTotal += a.getDistancia();
            }

            listBoxPRIM.DataSource = null;
            listBoxPRIM.DataSource = PSolucion;

            labelPesoPRIM.Text     = "Peso Total: " + Math.Round(pesoTotal, 4);
            pictureImagePRIM.Image = bmpGrafo;
        }