示例#1
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;
        }
示例#2
0
        public void hazKruskal()
        {
            bmpGrafo = new Bitmap(imgGrafo);
            int    conta     = 0;
            double pesoTotal = 0;

            List <Arista>          C        = new List <Arista>(graf.getLA()); //Lista de aristas
            List <Arista>          solucion = new List <Arista>();
            List <List <Vertice> > CC       = new List <List <Vertice> >();    //Lista de lista de vertices, conjunto conexo

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

            //Leno mi lista de compoentes conexos con una lista individual de vertices
            for (int i = 0; i < graf.getLV().Count; i++)
            {
                List <Vertice> comp = new List <Vertice>();
                comp.Add(graf.getLV()[i]);

                CC.Add(comp);
            }

            while (conta < graf.getLA().Count)
            {
                Arista a = new Arista();

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

                a = C[conta];                 //Selecciono la arista que va en mi contador, siempre será la menor

                conta++;

                //Factible
                a.getOrigen();
                a.getDestino();
                int e1 = 0, e2 = 0;

                for (int i = 0; i < CC.Count; i++)
                {
                    List <Vertice> laux = new List <Vertice>();
                    laux = CC[i];

                    //Obtengo los rangos para crear los componenetes conexos y hacerlos una lista
                    for (int j = 0; j < CC[i].Count; j++)
                    {
                        if (a.getOrigen() == laux[j])
                        {
                            e1 = i;
                        }
                        if (a.getDestino() == laux[j])
                        {
                            e2 = i;
                        }
                    }
                }

                //Concateno los componentes conexos
                if (e1 != e2)
                {
                    solucion.Add(a);
                    CC[e1].AddRange(CC[e2]);
                    CC.RemoveAt(e2);
                }
            }

            listBoxKRUSKAL.DataSource = null;
            listBoxKRUSKAL.DataSource = solucion;

            //Dibujo las aristas restantes en mi slución
            Graphics gra   = Graphics.FromImage(bmpGrafo);
            Pen      lapiz = new Pen(Color.Blue, 10);

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

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

            labelPesoKRUSKAL.Text = "Peso Total: " + Math.Round(pesoTotal, 4);

            pictureImageKRUSKAL.Image = bmpGrafo;
        }