public bool esXDescendienteDeY(CVertice X, CVertice Y)
 {
     if (Y.getNumero() <= X.getNumero() &&
         X.getNumero() <= (Y.getNumero() + descendientes[G.getListaAdyacencia().IndexOf(G.buscaNodoVertice(Y))]))
     {
         return(true);
     }
     return(false);
 }
        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);
        }
 public void clasificaArcos(bool ramp)
 {
     foreach (CArista a in G.getListaAristas())
     {
         if (G.getTipo() == DIRIGIDO)
         {
             if (!arcos_arbol.Contains(a)) //Si no es arco de arbol
             {
                 CVertice u = a.getVOrigen(), v = a.getVDestino();
                 if (u.getNumero() >= v.getNumero() && esXDescendienteDeY(u, v))          //Si es arco de retroceso
                 {
                     arcos_retroceso.Add(a);
                 }
                 else if ((u.getNumero() <= v.getNumero() && esXDescendienteDeY(v, u)))    //Si es arco de avance
                 {
                     arcos_avance.Add(a);
                 }
                 else
                 {
                     arcos_cruzados.Add(a);                                              //Entonces es arco cruzado
                 }
             }
         }
         else
         {
             if (!arcos_arbol.Contains(a))
             {
                 if (ramp)
                 {
                     arcos_cruzados.Add(a);
                 }
                 else
                 {
                     arcos_retroceso.Add(a);
                 }
             }
         }
     }
 }
 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);
 }
        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);
        }
 public bool esXDescendienteDeY(CVertice X, CVertice Y)
 {
     if( Y.getNumero() <= X.getNumero()
         && X.getNumero() <= (Y.getNumero() + descendientes[G.getListaAdyacencia().IndexOf(G.buscaNodoVertice(Y))]))
     {
         return true;
     }
     return false;
 }