public EnlaceVisual(int peso, Nodo nodoA, Nodo nodoB) { this.NodoA = nodoA; this.NodoB = nodoB; this.Peso = peso; this.Color = Color.Black; }
/// <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; }
/// <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; }
/// <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; }
/// <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); }
/// <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; }
/// <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; }