Beispiel #1
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 #2
0
 public static List<Enlace> Ejecutar(Grafo g){
     List<Enlace> resultado = new List<Enlace>();         // Creo una nueva lista de enlaces 
     Nodo n = g.GetNodo();                                // Obtengo el primer nodo del grafo
     if (n != null)
     {                                                    // Si el grafo tiene nodos
         n.visitado = true;                               // Marco el nodo como visitado
         List<Enlace> enlaces = g.GetEnlaces(n);          // Obtengo todos los enlaces que contenga a n cuyo otro nodo no este visitado
         while (!g.TodosVisitados())                      // Mientras no esten todos los nodos visitados
         {
             var enlaceMenor = EnlaceMenorPeso(enlaces);  // Obtego el enlace de menor peso 
             n = enlaceMenor.GetNodoNoVisitado();         // Obtengo el nodo no visitado del enlace
             n.visitado = true;                           // Marco el nodo como visitado
             enlaces.AddRange(g.GetEnlaces(n));           // Agrego a la lista de enlaces a visitar todos los enlaces del nuevo nodo
             enlaces = RemoverEnlaces(enlaces);           // Elimino todos los enlaces con los 2 nodos visitados de la lista
             resultado.Add(enlaceMenor);                  // Agrego el enlace menor a la lista de resultado
         }
     }
    
     return resultado;
 }
Beispiel #3
0
 public static List<Enlace> Ejecutar(Grafo g)
 {
     var arm = new List<Enlace>();                       // Creo la lista de enlaces que contendra el ARM 
     var enlaces = g.GetEnlacesDeMenorAMayor();          // Obtengo la lista de enlaces del nodo ordenada de menor a mayor peso
     foreach (var enlace in enlaces)                     // Recorro la lista de enlaces
     {
         if (!enlace.NodosVisitados())                   // Si el enlaces no tiene ambos nodos visitados
         {
             enlace.NodoA.visitado = true;               // Marco el NodoA del enlace como visitado
             enlace.NodoB.visitado = true;               // Marco el NodoB del enlace como visitado
             arm.Add(enlace);                            // Agrego el enlace al ARM
         }
         else
         {
             if(!FormaCiclo(g,g.GetEnlacesVisitados(enlace.NodoA), new List<Enlace>(), arm, enlace.NodoA, enlace.NodoB))  // Si no se forma un ciclo
             {
                 arm.Add(enlace);                       // Agrego el enlace al ARM
             }
         }
     }
     return arm;                                        // Devuelve el ARM
 }
Beispiel #4
0
 private void Reset()
 {
     this.g = new Grafo();
     this.nodos = new List<Nodo>();
     this.enlaces = new List<Enlace>();
     this.resolucion = new List<Enlace>();
     this.indiceResolucion = 0;
     this.lblResultado.Text = string.Empty;
     this.Dibujar();
 }