Beispiel #1
0
        public EnlaceVisual(int peso, Nodo nodoA, Nodo nodoB)
		{
            this.NodoA = nodoA;
            this.NodoB = nodoB;
            this.Peso = peso;
            this.Color = Color.Black;
		}
Beispiel #2
0
 /// <summary>
 /// Si el nodo no existe lo agrego a la lista de nodos
 /// </summary>
 /// <param name="n">Nodo a agregar</param>
 /// <returns>True si el nodo se agrego</returns>
 public bool AgregarNodo(Nodo n) 
 {
     if (ExisteNodo(n))
     {
         return false;
     }
     Nodos.Add(n);
     return true;
 }
Beispiel #3
0
        /// <summary>
        /// Busca si existe el nodo en el grafo
        /// </summary>
        /// <param name="n">Nodo a buscar</param>
        /// <returns>True si existe</returns>
        private bool ExisteNodo(Nodo n)  
        {
            foreach (Nodo aux in Nodos)
            {
                if (n.nombre == aux.nombre)
                {
                    return true;
                }
            }

            return false;
        }
Beispiel #4
0
        /// <summary>
        /// Verifica que no se forme un ciclo entre el NodoA y el NodoB
        /// </summary>
        /// <param name="g">Grafo</param>
        /// <param name="enlaces">Lista de enlaces que contienen el NodoA</param>
        /// <param name="visitados">Lista de enlaces visitado</param>
        /// <param name="resultado">ARM parcial del algoritmo de Kruskal</param>
        /// <param name="nodoA">NodoA</param>
        /// <param name="nodoB">NodoB</param>
        /// <returns>Retorna true si exciste ciclo</returns>
        public static bool FormaCiclo(Grafo g, List<Enlace> enlaces, List<Enlace> visitados, List<Enlace> resultado, Nodo nodoA, Nodo nodoB)
        {
            foreach (var e in enlaces)
	        {
		       var otroNodo = e.GetOtroNodo(nodoA);
                
                if(otroNodo == nodoB && resultado.Contains(e))
                    return true;

                visitados.Add(e);
                var enlacesOtroNodo = g.GetEnlacesVisitados(otroNodo);
                BorrarEnlacesVisitados(enlacesOtroNodo, visitados);
                
                if (FormaCiclo(g, enlacesOtroNodo, visitados, resultado, otroNodo, nodoB))
                    return true;
	        } 
            
            return false;
        }
Beispiel #5
0
        /// <summary>
        /// Verifica que no se forme un ciclo entre el NodoA y el NodoB
        /// </summary>
        /// <param name="g">Grafo</param>
        /// <param name="enlaces">Lista de enlaces que contienen el NodoA</param>
        /// <param name="visitados">Lista de enlaces visitado</param>
        /// <param name="resultado">ARM parcial del algoritmo de Kruskal</param>
        /// <param name="nodoA">NodoA</param>
        /// <param name="nodoB">NodoB</param>
        /// <returns>Retorna true si exciste ciclo</returns>
        public static bool FormaCiclo(Grafo g, List <Enlace> enlaces, List <Enlace> visitados, List <Enlace> resultado, Nodo nodoA, Nodo nodoB)
        {
            foreach (var e in enlaces)
            {
                var otroNodo = e.GetOtroNodo(nodoA);

                if (otroNodo == nodoB && resultado.Contains(e))
                {
                    return(true);
                }

                visitados.Add(e);
                var enlacesOtroNodo = g.GetEnlacesVisitados(otroNodo);
                BorrarEnlacesVisitados(enlacesOtroNodo, visitados);

                if (FormaCiclo(g, enlacesOtroNodo, visitados, resultado, otroNodo, nodoB))
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #6
0
        /// <summary>
        /// Devuelve una lista de enlaces que contiene el nodo pasado por parametro, si al menos uno de los nodos del enlace no esta visitado
        /// </summary>
        /// <param name="n1"> Nodo a buscar</param>
        /// <returns>Lista de enlaces</returns>
        public List<Enlace> GetEnlaces(Nodo n1) 
        {
            var aux = new List<Enlace>();
            foreach (var e in this.Enlaces)
            {
                if (((e.NodoA.Equals(n1)) || (e.NodoB.Equals(n1))) && (!e.NodoA.visitado || !e.NodoB.visitado))
                {
                    aux.Add(e);
                }
            }

            return aux;
        }
Beispiel #7
0
 /// <summary>
 /// Devuelve una lista de enlaces donde ambos nodos estan visitados
 /// </summary>
 /// <param name="n1">Nodo a comparar</param>
 /// <returns>Lista de enlaces visitados</returns>
 public List<Enlace> GetEnlacesVisitados(Nodo n1) 
 {
     List<Enlace> resultado = new List<Enlace>();
     foreach (var enlace in this.Enlaces)
     {
         Nodo naux = enlace.GetOtroNodo(n1);
         if(naux != null)
         {
             if (naux.visitado)
                 resultado.Add(enlace);
         }
     }
     
     return resultado;
 }