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; }
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; }