示例#1
0
        public CGrafo construyeK5()
        {
            CGrafo k5 = new CGrafo(1, 0);

            for (int i = 0; i < 5; i++)
            {
                CVertice v = new CVertice(i+1,0,0,Color.White,Color.Black);
                v.setGrado(4);
                CNodoVertice cnv = new CNodoVertice(v);
                k5.getListaAdyacencia().Add(cnv);
            }

            foreach (CNodoVertice nv in k5.getListaAdyacencia())
            {
                foreach (CNodoVertice nv2 in k5.getListaAdyacencia())
                {
                    if (nv.getVertice().getId() != nv2.getVertice().getId())
                    {
                        nv.getRelaciones().Add(nv2);
                        nv.getVertice().getVecinos().Add(nv2.getVertice());
                        if (!k5.aristaRepetida(nv.getVertice(), nv2.getVertice()))
                        {
                            CArista ar = new CArista(nv.getVertice(), nv2.getVertice(),new Point(0,0),new Point(0,0),0);
                            k5.getListaAristas().Add(ar);
                        }
                    }
                }
            }

            k5.setNumeroAristas(10);
            k5.setNumeroVertices(5);

            return k5;
        }
示例#2
0
        public CGrafo construyeK33()
        {
            CGrafo k33 = new CGrafo(1, 0);

            for (int i = 0; i < 6; i++)
            {
                CVertice v = new CVertice(i + 1, 0, 0, Color.White, Color.Black);
                v.setGrado(3);
                CNodoVertice cnv = new CNodoVertice(v);
                k33.getListaAdyacencia().Add(cnv);
            }

            for (int i = 0; i < 3; i++)
            {
                for (int j = 3; j < 6; j++)
                {
                    k33.getListaAdyacencia()[i].getRelaciones().Add(k33.getListaAdyacencia()[j]);
                    k33.getListaAdyacencia()[i].getVertice().getVecinos().Add(k33.getListaAdyacencia()[j].getVertice());
                    k33.getListaAdyacencia()[j].getRelaciones().Add(k33.getListaAdyacencia()[i]);
                    k33.getListaAdyacencia()[j].getVertice().getVecinos().Add(k33.getListaAdyacencia()[i].getVertice());
                    CArista ar = new CArista(k33.getListaAdyacencia()[i].getVertice(), k33.getListaAdyacencia()[j].getVertice(), new Point(0, 0), new Point(0, 0), 0);
                    k33.getListaAristas().Add(ar);
                }
            }

            k33.setNumeroAristas(9);
            k33.setNumeroVertices(6);

            return k33;
        }
示例#3
0
 public static bool hayVerticeGradoCero(CNodoVertice cnv)
 {
     if (cnv.getVertice().getGrado() == 0)
         return true;
     else
         return false;
 }
        public bool esIncidenteCon(CArista ari, CNodoVertice nodo_od)
        {
            bool encontrado = false;
            if (ari.getVOrigen().getId() == nodo_od.getVertice().getId() || ari.getVDestino().getId() == nodo_od.getVertice().getId())
                encontrado = true;

            return encontrado;
        }
 public bool estaEnListaRelaciones(CNodoVertice nodo, CNodoVertice relacion)
 {
     bool encontrado = false;
     foreach (CNodoVertice cnv in nodo.getRelaciones())
     {
         if (relacion.getVertice().getId() == cnv.getVertice().getId())
         {
             encontrado = true;
             break;
         }
     }
     return encontrado;
 }
示例#6
0
        public void calculaCaminoMasCorto(CNodoVertice origen)
        {
            List<CNodoVertice> S = new List<CNodoVertice>();
            List<CNodoVertice> P = new List<CNodoVertice>();
            List<CNodoVertice> VS;
            int[] D = new int[n];

            S.Add(origen);

            for (int i = 0; i < n; i++)
            {
                D[i] = C[V.IndexOf(origen), i];
                P.Add(origen);
            }

            for (int j = 0; j < n-1; j++)
            {
                VS = VminusS(S);
                CNodoVertice w = menorVminusS(D,VS);
                S.Add(w);
                VS = VminusS(S);
                foreach (CNodoVertice cnv in VS)
                {
                    if(G.sonVerticesAdyacentes(cnv.getVertice(),w.getVertice()))
                    {
                        int aux = D[V.IndexOf(cnv)];
                        if (C[V.IndexOf(w), V.IndexOf(cnv)] == INFINITO)
                            C[V.IndexOf(w), V.IndexOf(cnv)] -= D[V.IndexOf(w)];

                        D[V.IndexOf(cnv)] = minimoDe(D[V.IndexOf(cnv)], D[V.IndexOf(w)] + C[V.IndexOf(w), V.IndexOf(cnv)]);
                        if (aux != D[V.IndexOf(cnv)])
                            P[V.IndexOf(cnv)] = w;
                    }
                }
            }

            muestraResultado(D, P, origen);
        }
示例#7
0
 public int ordenaPorNumero(CNodoVertice nv1,CNodoVertice nv2)
 {
     return nv2.getVertice().getNumero().CompareTo(nv1.getVertice().getNumero());
 }
示例#8
0
 public int ordenaPorID(CNodoVertice nv1, CNodoVertice nv2)
 {
     return nv1.getVertice().getId().CompareTo(nv2.getVertice().getId());
 }
示例#9
0
        public bool laRaizTiene2OMasHijos(CNodoVertice cnv_ini)
        {
            int num_hijos = 0;
            foreach (CArista a in arcos_arbol)
            {
                CVertice or = a.getVOrigen(), de = a.getVDestino();
                int num_or = or.getNumero(), num_de = de.getNumero();
                if ((or.getId() == cnv_ini.getVertice().getId() && num_or < num_de) ||
                    (de.getId() == cnv_ini.getVertice().getId() && num_de < num_or))
                {
                    num_hijos++;
                }
            }

            if (num_hijos >= 2)
                return true;

            return false;
        }
示例#10
0
 public bool tieneHijosConBajoMayorOIgualAlNumDe(CNodoVertice cnv)
 {
     foreach (CArista a in arcos_arbol)
     {
         CVertice or = a.getVOrigen(), de = a.getVDestino();
         int num_or = or.getNumero(), num_de = de.getNumero();
         if (or.getId() == cnv.getVertice().getId() && num_or < num_de && de.getBajo() >= cnv.getVertice().getNumero())
             return true;
         else if (de.getId() == cnv.getVertice().getId() && num_de < num_or && or.getBajo() >= cnv.getVertice().getNumero())
             return true;
     }
     return false;
 }
示例#11
0
 public void RP_RPA(CNodoVertice cnv)
 {
     cnv.getVertice().setVisitado(true);
     foreach (CNodoVertice w in cnv.getRelaciones())
     {
         if (w.getVertice().getVisitado() != true)
             RP_RPA(w);
     }
     cnv.getVertice().setBajo(minimo(cnv.getVertice().getNumero(),getZde(cnv),getYde(cnv)));
 }
示例#12
0
        //Puntos de articulacion
        public void RecorridoEnProfundidadPtosArticulacion(CNodoVertice cnvid)
        {
            foreach (CNodoVertice cv in G.getListaAdyacencia())
                cv.getVertice().setVisitado(false);

            if (cnvid.getVertice().getVisitado() != true)
                RP_RPA(cnvid);

            foreach (CNodoVertice cnv in G.getListaAdyacencia())
            {
                if (cnv.getVertice().getId() != cnvid.getVertice().getId())
                    if (cnv.getVertice().getVisitado() != true)
                        RP_RPA(cnv);
            }
        }
示例#13
0
        public void construyeGR()
        {
            G.getListaAdyacencia().Sort(ordenaPorNumero);
            foreach (CNodoVertice nv in G.getListaAdyacencia())
            {
                CNodoVertice nuevo = new CNodoVertice(new CVertice(nv.getVertice().getId(), 0, 0, Color.Transparent, Color.Transparent));
                GR.Add(nuevo);
            }

            foreach (CNodoVertice cnv in GR)
                cnv.setRelacionesFC(getListaNuevaDe(cnv));

            G.getListaAdyacencia().Sort(ordenaPorID);
        }
示例#14
0
        //Recorrido en Amplitud
        public void recorridoEnAmplitud(CNodoVertice vert_ini)
        {
            vert_ini.getVertice().setVisitado(true);
            List<CNodoVertice> Vp = construyeLAdyPrima(G.getListaAdyacencia(), vert_ini);
            List<CNodoVertice> Q = new List<CNodoVertice>();
            Q.Add(vert_ini);

            while (Vp.Count != 0)
            {
                CNodoVertice u = Q[0];
                Q.RemoveAt(0);
                foreach (CNodoVertice w in u.getRelaciones())
                {
                    if (!w.getVertice().getVisitado())
                    {
                        w.getVertice().setVisitado(true);
                        Q.Add(w);
                        enlistaArcosArbol(u.getVertice(), w.getVertice());
                        Vp.Remove(w);
                    }
                }
            }
        }
示例#15
0
        public List<CNodoVertice> construyeLAdyPrima(List<CNodoVertice> lady, CNodoVertice cnv_elim)
        {
            List<CNodoVertice> prima = new List<CNodoVertice>();
            foreach (CNodoVertice cnv in lady)
                prima.Add(cnv);

            prima.Remove(cnv_elim);
            return prima;
        }
示例#16
0
        public void RecorridoEnProfundidad(CNodoVertice cnvid)
        {
            if (cnvid.getVertice().getVisitado() != true)
            {
                int nd = 0;
                RP_R(cnvid, ref nd);
                descendientes[G.getListaAdyacencia().IndexOf(cnvid)] = nd;
            }

            foreach (CNodoVertice cnv in G.getListaAdyacencia())
            {
                if (cnv.getVertice().getId() != cnvid.getVertice().getId())
                {
                    if (cnv.getVertice().getVisitado() != true)
                    {
                        int nd = 0;
                        RP_R(cnv, ref nd);
                        descendientes[G.getListaAdyacencia().IndexOf(cnv)] = nd;
                    }
                }
            }
        }
示例#17
0
        //Otros de componentes fuertes
        public List<CNodoVertice> getListaNuevaDe(CNodoVertice nv)
        {
            List<CNodoVertice> listanueva = new List<CNodoVertice>();

            foreach (CNodoVertice cnv in G.getListaAdyacencia())
            {
                foreach (CNodoVertice rel in cnv.getRelaciones())
                {
                    if (rel.getVertice().getId() == nv.getVertice().getId())
                        listanueva.Add(getCNVenGR(cnv.getVertice().getId()));
                }
            }

            return listanueva;
        }
示例#18
0
 public void RP_R(CNodoVertice cnv,ref int ndes)
 {
     cnv.getVertice().setVisitado(true);
     cnv.getVertice().setNumero(++num);
     foreach (CNodoVertice w in cnv.getRelaciones())
     {
         if (w.getVertice().getVisitado() != true)
         {
             int nd = 0;
             RP_R(w, ref nd);
             descendientes[G.getListaAdyacencia().IndexOf(w)] = nd;
             ndes += nd + 1;
             enlistaArcosArbol(cnv.getVertice(), w.getVertice());
         }
     }
 }
示例#19
0
        public int getYde(CNodoVertice cnv)
        {
            List<int> yes =new List<int>();
            int ymin = -1;
            foreach (CArista a in arcos_arbol)
            {
                CVertice or = a.getVOrigen(), de = a.getVDestino();
                int num_or = or.getNumero(), num_de = de.getNumero();
                if (or.getId() == cnv.getVertice().getId() && num_or < num_de)
                {
                    if(de.getBajo() != 0)
                        yes.Add(de.getBajo());
                }
                else if (de.getId() == cnv.getVertice().getId() && num_de < num_or)
                {
                    if (or.getBajo() != 0)
                        yes.Add(or.getBajo());
                }

                if (yes.Count != 0)
                {
                    yes.Sort();
                    ymin = yes[0];
                }
            }

            return ymin;
        }
示例#20
0
        public void sacaPuntosDeArticulacion(CNodoVertice cnv_ini)
        {
            List<CNodoVertice> puntos_articulacion = new List<CNodoVertice>();

            if (laRaizTiene2OMasHijos(cnv_ini))
                puntos_articulacion.Add(cnv_ini);

            foreach (CNodoVertice cnv in G.getListaAdyacencia())
            {
                if (cnv.getVertice().getId() != cnv_ini.getVertice().getId() && tieneHijosConBajoMayorOIgualAlNumDe(cnv))
                    puntos_articulacion.Add(cnv);
            }

            if(puntos_articulacion.Count != 0)
            {
                string cad = "{ ";
                foreach (CNodoVertice p in puntos_articulacion)
                {
                    p.getVertice().setRelleno(Color.LightPink.ToArgb());
                    p.getVertice().dibujate(Graphics.FromImage(G.getBMP()), G.getBMP(),tp);
                    cad += "(" + p.getVertice().getId().ToString() + ")";
                    if(puntos_articulacion.IndexOf(p) != puntos_articulacion.Count-1)
                        cad += ", ";
                }
                cad += " }.        ";
                MessageBox.Show(" Vértices Cut : "+cad, "Puntos de articulación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                foreach (CNodoVertice p in puntos_articulacion)
                {
                    p.getVertice().borrate(Graphics.FromImage(G.getBMP()), G.getBMP(), tp);
                    p.getVertice().setRelleno(Color.LightGoldenrodYellow.ToArgb());
                    p.getVertice().dibujate(Graphics.FromImage(G.getBMP()), G.getBMP(), tp);
                }
            }
            else
                MessageBox.Show(" No existen vértices CUT para el Grafo "+G.getId().ToString()+".     ","Puntos de articulación", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
示例#21
0
        public int getZde(CNodoVertice cnv)
        {
            List<int> zetas;
            int zmin = -1;

            if (arcos_arbol.Count != 0 && arcos_retroceso.Count != 0)
            {
                zetas = new List<int>();
                foreach (CArista a in arcos_retroceso)
                {
                    if (a.getVOrigen().getId() == cnv.getVertice().getId())
                        zetas.Add(a.getVDestino().getNumero());
                    else if (a.getVDestino().getId() == cnv.getVertice().getId())
                        zetas.Add(a.getVOrigen().getNumero());
                }

                if (zetas.Count != 0)
                {
                    zetas.Sort();
                    zmin = zetas[0];
                }
            }

            return zmin;
        }
示例#22
0
        public void CF_R(CNodoVertice cnv,ref List<int> ar,int vuelta)
        {
            cnv.getVertice().setVisitado(true);

            foreach (CNodoVertice w in cnv.getRelaciones())
            {
                if (w.getVertice().getVisitado() != true)
                {
                    ar.Add(w.getVertice().getId());
                    CF_R(w,ref ar,vuelta);
                }
            }

            if(vuelta == 1)
                cnv.getVertice().setNumero(++num);
            else
                cnv.getVertice().setNumero(++num2);
        }
示例#23
0
        public void muestraResultado(int[] pesos_totales, List<CNodoVertice> caminos,CNodoVertice origen)
        {
            string camaux = "";
            DataTable dt = new DataTable();
            object[] values = new object[3];
            int ind = 0;
            List<int> camino = new List<int>();
            bool sincamino = false;

            dt.Columns.Add("Destino");
            dt.Columns.Add("Camino");
            dt.Columns.Add("Peso Total");

            for (int i = 0; i < pesos_totales.Length; i++)
            {
                ind = i;
                values[0] = V[i].getVertice().getId().ToString();

                if (pesos_totales[i] != INFINITO && pesos_totales[i] >= 0)
                    values[2] = " " + pesos_totales[i].ToString();
                else
                {
                    sincamino = true;
                    values[2] = " - ";
                }

                while (origen.getVertice().getId() != caminos[ind].getVertice().getId())
                {
                    camino.Add(caminos[ind].getVertice().getId());
                    ind = V.IndexOf(caminos[ind]);
                }

                camaux += origen.getVertice().getId().ToString()+", ";
                for(int y = camino.Count-1;y>=0;y--)
                    camaux += camino[y].ToString() + ", ";

                camaux += V[i].getVertice().getId().ToString();

                if (sincamino)
                {
                    values[1] = " No existe";
                    sincamino = false;
                }
                else
                    values[1] = camaux;

                dt.Rows.Add(values);
                camaux = "";
                camino.Clear();
            }

            DDijkstra dij = new DDijkstra(dt, origen.getVertice().getId());
            dij.ShowDialog();
        }