示例#1
0
        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);
        }
示例#2
0
        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;
                    }
                }
            }
        }