public static Tree kruskal(Tree arbol, List <Vertice> subgrafo) { List <Vertice> visitados = new List <Vertice>(); Arista minArista; List <Arista> candidatos = new List <Arista>(); List <Arista> prometedor = new List <Arista>(); List <List <Vertice> > CCList = new List <List <Vertice> >(); List <string> visited = new List <string>(); foreach (Vertice vertice in subgrafo) { var newVertice = new Vertice(vertice.GetCoordenada(), vertice.GetRadius(), vertice.GetArea(), vertice.GetId()); newVertice.SetGroup(vertice.GetGroup()); arbol.addVertice(newVertice); List <Vertice> CC = new List <Vertice>(); CC.Add(vertice); CCList.Add(CC); foreach (Arista arista in vertice.GetAristas()) { if (!visitados.Contains(arista.GetSig())) { candidatos.Add(arista); } } visitados.Add(vertice); } while (CCList.Count != 1) { minArista = getMinArtista(candidatos); var c_1 = findCC(CCList, findVerticeInList(subgrafo, minArista.GetVid())); var c_2 = findCC(CCList, minArista.GetSig()); if (c_1 != c_2) { c_1.AddRange(c_2); CCList.Remove(c_2); prometedor.Add(minArista); arbol.findvertice(minArista.GetVid()).agregarArista(minArista.GetSig(), minArista.GetPeso()); } candidatos.Remove(minArista); } arbol.SetOrdenAristas(prometedor); return(arbol); }
private void pictureBox1_MouseClick(object sender, MouseEventArgs e) { if (grafodetectado) { Color pixel = imageCopy.GetPixel(e.X, e.Y); if (pixel.R == pixel.G && pixel.G == pixel.B && pixel.R != 255) { List <Arista> prometodor = new List <Arista>(); List <string> visited = new List <string>(); List <Arista> aristaQueue = new List <Arista>(); //List<Tuple<String, Arista>> tuplaArista = new List<Tuple<string, Arista>>(); Vertice vertice_click = Utilities.BelongsTo(e.X, e.Y, grafo, imageCopy); Tree newPrim = new Tree("P"); if (vertice_click != null && !Utilities.isInsideTree(ARMPrim, vertice_click)) { foreach (Vertice ver in grafo.GetSubgraphs()[vertice_click.GetGroup() - 1]) { var nuevoVertice = new Vertice(ver.GetCoordenada(), ver.GetRadius(), ver.GetArea(), ver.GetId()); nuevoVertice.SetGroup(ver.GetGroup()); newPrim.addVertice(nuevoVertice); } foreach (Arista arista in vertice_click.GetAristas()) { //tuplaArista.Add(new Tuple<String, Arista>(vertice_click.GetId(),arista)); aristaQueue.Add(arista); } Arista minArista; visited.Add(vertice_click.GetId()); while (aristaQueue.Count > 0) { minArista = Utilities.getMinArtista(aristaQueue); if (!visited.Contains(minArista.GetSig().GetId())) { newPrim.findvertice(minArista.GetVid()).agregarArista(minArista.GetSig(), minArista.GetPeso()); prometodor.Add(minArista); visited.Add(minArista.GetSig().GetId()); foreach (Arista arista in minArista.GetSig().GetAristas()) { if (!visited.Contains(arista.GetSig().GetId())) { aristaQueue.Add(arista); } } } aristaQueue.Remove(minArista); } newPrim.SetOrdenAristas(prometodor); newPrim.calcularPesoTotal(); ARMPrim.Add(newPrim); PrimG.Text = ARMPrim.Count.ToString(); PrimList.DataSource = null; PrimList.DataSource = ARMPrim.OrderBy(x => x.GetVertices()[0].GetGroup()).ToList(); newPrim.drawTree(Prim, Color.Yellow); pictureBox1.Image = Prim; verPrim.Enabled = false; verGrafo.Enabled = true; verkruskal.Enabled = true; } } } }