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 } }
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; }
public void insertarArista(Arista a) { la.Add(a); }