예제 #1
0
        public void ARMPrim(int ori, List <Arista> listaAristas, List <Vertice> gr, Bitmap bmpGrafo)
        {
            subGrafos.Clear();
            subAristas.Clear();
            bmpFinal = new Bitmap(bmpGrafo);
            List <Arista>  candidatas = new List <Arista>(listaAristas); //CONTIENE LAS ARISTAS DEL GRAFO
            List <Arista>  prometedor = new List <Arista>();             //PROMETEDOR CONTIENE LAS ARISTAS DEL ARBOL ARM
            List <int>     visitados  = new List <int>();                //VISITADOS CONTIENE TODOS LOS IDENTIFICADORES DE LOS VERTICES
            List <Vertice> visited    = new List <Vertice>();            //VISITED CONTIENE LOS VERTICES QUE YA SE TOMARON SE LIMPIA POR SUBGRAFO

            pesoTotal = 0;

            if (candidatas.Count == 0)
            {
                MessageBox.Show("No Puedo hacer nada. No hay Aristas");
                MessageBox.Show("Numero de subgrafos: " + gr.Count);
                return;
            }
            //candidatas.Sort((x, y) => x.getPeso().CompareTo(y.getPeso())); //ORDENAR LA LISTA DE CANDIDATAS DE MENOR A MAYOR

            visitados.Add(ori);   //AÑADIR IDENTIFICADOR DEL VERTICE A LA LISTA

            visited.Add(gr[ori]); //AÑADIR EL VERTICE A LA LISTA

            if (candidatas.Count == 0)
            {
                //SI CANDIDATAS ES CERO ENTONCES NO HAY ARISTAS EN EL GRAFO
                return;
            }

            List <Arista> temp = new List <Arista>();

            while (visitados.Count < gr.Count)

            /*ITERAR HASTA QUE VISITADOS CONTENGA LA MISMA CANTIDAD DE IDENTIFICADORES QUE DE VERTICES EN EL GRAFO
             * ASI NOS ASEGURAMOS DE QUE YA RECORRIMOS TODOS LOS VERTICES*/

            {
                Arista a = new Arista();

                a = aristaQueSale(visitados, candidatas); //METODO QUE PERMITE ELEGIR CUAL ES LA MENOR ARISTA

                if (a.getPeso() == float.MaxValue)

                /*SI EL PESO DE LA ARISTA ES IGUAL AL MAXIMO VALOR DE LAS POSIBLES ENTONCES YA TERMINO CON ESA ISLA
                 * SE NECESITA VERIFICAR SI HAY O NO MAS ISLAS EN EL GRAFO
                 */
                {
                    List <Vertice> aux = new List <Vertice>(visited);         //LISTA 'aux' CONTIENE LOS VERTICE YA VISITADOS
                    subGrafos.Add(aux);                                       //AGREGAR CADA ISLA A LA LISTA 'subgrafos'

                    int ari = buscarIsla(visitados, candidatas, gr, visited); //METODO PARA BUSCAR MAS ISLAS

                    visitados.Add(ari);                                       //AGREGAR EL IDENTIFICADOR DEL VERTICE NO VISITADO
                    visited.Add(gr[ari]);                                     //AGREGAR EL VERTICE NO VISITADO

                    List <Arista> auxTemp = new List <Arista>(temp);
                    subAristas.Add(auxTemp); //AÑADIR ARISTAS DE CADA SUBARBOL
                    temp.Clear();
                    continue;                //PERMITE REGRESAR AL INICIO DEL CICLO, SIN EJECUTAR LO RESTANTE. (INICIA DE NUEVO)
                }

                prometedor.Add(a); //AÑADIR ARISTA A PROMETEDOR
                temp.Add(a);
                if (visitados.Contains(a.getVerOri()))
                {
                    /* SI VISITADOS YA CONTIENE EL IDENTIFICADOR DEL VERTICE ORIGEN DE LA ARISTA
                     * AGREGAMOS IDENTIFICADOR DE VERTICE DE DESTINO.
                     * AGREGAMOS VERTICE DE DESTINO.
                     */
                    visitados.Add(a.getVerDes());
                    visited.Add(a.getDestino());
                }
                else
                {
                    /* SI VISITADOS NO CONTIENE EL IDENTIFICADOR DEL VERTICE ORIGEN DE LA ARISTA
                     * AGREGAMOS IDENTIFICADOR DE VERTICE DE ORIGEN.
                     * AGREGAMOS VERTICE DE ORIGEN.
                     */
                    visitados.Add(a.getVerOri());
                    visited.Add(a.getOrigen());
                }
            }

            List <Vertice> ax = new List <Vertice>(visited); //CREAR LISTA AUXILIAR DE VERTICES DE ESE SUBGRAFO

            subGrafos.Add(ax);                               //AGREGAR ESA LISTA DE VERTICES A LA LISTA DE 'subgrafos'
            subAristas.Add(temp);
            Graphics gra   = Graphics.FromImage(bmpFinal);
            Pen      lapiz = new Pen(Color.DarkBlue, 10);

            listaPrometedor = new List <Arista>(prometedor);
            for (int i = 0; i < prometedor.Count; i++)
            {
                gra.DrawLine(lapiz, prometedor[i].getXor().X, prometedor[i].getXor().Y, Convert.ToInt32(prometedor[i].getXdes().X), Convert.ToInt32(prometedor[i].getXdes().Y));
            }

            foreach (Arista a in prometedor)
            {
                pesoTotal += a.getPeso(); //ACUMULADOR DE LOS PESOS DE LAS ARISTAS DEL RECORRIDO
            }
        }
예제 #2
0
        public void ARMKruscal(Bitmap bmpGrafo, List <Arista> ListaAristas, List <Vertice> gr)
        {
            bmpFinal = new Bitmap(bmpGrafo);
            List <Arista>          candidatas = new List <Arista>(ListaAristas); //CONTIENE LAS ARISTAS DEL GRAFO
            List <Arista>          prometedor = new List <Arista>();             //PROMETEDOR CONTIENE LAS ARISTAS DEL ARBOL ARM
            List <List <Vertice> > cC         = new List <List <Vertice> >();    //{A, B, C, D} {E, F, G} EN CASO DE HABR DOS O MAS, HAY SUBGRAFOS

            pesoTotal = 0;

            candidatas.Sort((x, y) => x.getPeso().CompareTo(y.getPeso()));            //ORDENAMIENTO DE LAS ARISTAS. DE MENOR A MAYOR

            for (int i = 0; i < gr.Count; i++)
            {
                //FOR PARA OBTENER EL IDENTIFICADOR DE CADA VERTICE.
                List <Vertice> comp = new List <Vertice>();
                comp.Add(gr[i]);

                cC.Add(comp);
            }

            int cont = 0;

            //SI CANDIDATAS ESTA EN CEROS QUIERE DECIR QUE NO HAY ARISTAS
            if (candidatas.Count == 0)
            {
                MessageBox.Show("No Puedo hacer nada. No hay Aristas \nNumero de subgrafos: " + gr.Count);
                return;
            }

            while (cont < ListaAristas.Count)
            //CONTADOR INICIA EN CERO, MIENTRAS CONTADOR SEA MENOR QUE EL NUMERO DE ARISTAS DE MI GRAFO (ITERAR)
            {
                Arista a = new Arista();
                a = candidatas[cont];
                cont++;

                int c_1 = 0;
                int c_2 = 0;

                for (int i = 0; i < cC.Count; i++)                //FOR PARA COMPARAR
                {
                    List <Vertice> aux = new List <Vertice>();
                    //LISTA AUXILIAR PARA CADA UNA DE LAS LISTAS QUE CONTIENE cC

                    /*AUX VA A CAMBIAR CON FORME SE VAYA AVANZANDO EN LA POSICION DE cC, ASI SE CHECAN
                     * TODAS LAS LISTAS (SUCONJUNTOS) DEL GRAFO.
                     */
                    aux = cC[i];

                    for (int j = 0; j < cC[i].Count; j++)
                    //ITERAR HASTA QUE J RECORRA TODOS LOS COMPONENTES DE LA LISTA i DENTRO DE cC
                    {
                        //SABER A CUAL SUBCONJUNTO PERTENECE LA ARISTA

                        if (a.getVerOri() == aux[j].getNum())
                        //SI EL NUMERO DEL VERTICE ORIGEN DE MI ARISTA ES IGUAL AL NUMERO DEL VERTICE EN aux[j]
                        {
                            c_1 = i;                             //ENTONCES EL ELEMENTO 1 ES EL NUMERO DE LA LISTA DENTRO DE cC
                        }

                        if (a.getVerDes() == aux[j].getNum())    //SI EL NUMERO DEL DESTINO DE MI ARISTA ES IGUAL AL NUMERO DEL VERTICE EN aux[j]
                        {
                            c_2 = i;                             //ENTONCES EL ELEMENTO 2 ES EL NUMERO DE LA LISTA DENTRO DE cC
                        }
                    }
                }

                if (c_1 != c_2)
                {
                    //SI ELEMENTO 1 Y 2 SON DISTINTOS ENTONCES AGREGAMOS LA ARISTA A MI SOLUCION.
                    prometedor.Add(a);
                    cC[c_1].AddRange(cC[c_2]);            //AddRange SIRVE PARA CONCATENAR EL SUBCONJUNTO DEL ELEMENTO 1 CON EL SUB DEL ELEM 2
                    cC.RemoveAt(c_2);                     //RemoveAt nos permite remover un elemento en especifico dentro de las listas que contiene la lista cC.
                    //EXTRAER LA ARISTA DE CANDIDATOS
                }
            }

            Graphics gra   = Graphics.FromImage(bmpFinal);
            Pen      lapiz = new Pen(Color.Magenta, 5);

            listaPrometedor = new List <Arista>(prometedor);
            for (int i = 0; i < prometedor.Count; i++)
            {
                //UTILIZAR EL DRAWLINE PARA PINTAR CADA ARISTA EN MI LISTA SOLUCION
                gra.DrawLine(lapiz, prometedor[i].getOri().X, prometedor[i].getOri().Y, prometedor[i].getDest().X, prometedor[i].getDest().Y);
            }

            foreach (Arista ari in prometedor)
            {
                //POR CADA ARISTA EN MI LISTA DE SOLUCION VAMOS A CALCULAR SU PESO
                pesoTotal += ari.getPeso();                 //ACUMULADOR PARA SUMAR TODOS LOS PESOS DE LAS ARISTAS
            }

            subGrafos = cC;
        }
예제 #3
0
 public void insertarArista(Arista a)
 {
     la.Add(a);
 }