/// <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; }
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; }
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 }
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(); }