예제 #1
0
        private Arco ObtienePrimerArco(NodoGrafo nodo)
        {
            Arco arco = null;

            if (nodo.arcos != null && nodo.arcos.Count > 0)
            {
                arco = nodo.arcos.First();
            }

            return(arco);
        }
예제 #2
0
        private void AdicionaRutaFinal(ref List <NodoGrafo> rutaActual, ref List <List <NodoGrafo> > rutasFinales)
        {
            NodoGrafo nodoAux = null;

            nodoAux = rutaActual.Last();
            if (nodoAux.arcos == null && !existeRutaFinal(rutaActual, ref rutasFinales)) //Es el nodo de fin
            {
                rutasFinales.Add(rutaActual);
            }
            // else if(nodoAux.arcos!=null && nodoAux.arcos.Count>0) {
            //     rutasPendientes.Push(rutaActual);
            // }
        }
예제 #3
0
        private void relacionarNodo(NodoGrafo nodoPredecesor, NodoGrafo nodo)
        {
            List <NodoGrafo> arcos = null;

            arcos = new List <NodoGrafo>();
            if (nodoPredecesor.arcos != null && nodoPredecesor.arcos.Count > 0)
            {
                nodoPredecesor.arcos.Add(nodo);
            }
            else if (nodoPredecesor.arcos == null)
            {
                arcos.Add(nodo);
                nodoPredecesor.arcos = arcos;
            }
        }
예제 #4
0
 private void mostrarNodoRelaciones(NodoGrafo nodo, bool hayPendientes)
 {
     if (nodo != null && nodo.arcos != null && nodo.arcos.Count > 0)
     {
         Console.WriteLine($@"[{nodo.label}] se relaciona con:");
         foreach (NodoGrafo n in nodo.arcos)
         {
             Console.WriteLine($"\t––> [{n.label}]({n.peso})");
         }
     }
     else if (nodo != null && nodo.arcos == null && !hayPendientes)
     {
         Console.WriteLine($@"[{nodo.label}].");
     }
 }
예제 #5
0
        public void InsertarRelacionarNodo(string labelPredecesor, string labelNodo, int peso)
        {
            NodoGrafo nodo           = null;
            NodoGrafo nodoPredecesor = null;

            nodo = new NodoGrafo(labelNodo, peso);
            if (labelPredecesor == null && estaVacio())
            {
                inicio = nodo;
            }
            else if (!estaVacio() && existeNodo(labelPredecesor))
            {
                nodoPredecesor = ObtenerNodo(labelPredecesor);
                relacionarNodo(nodoPredecesor, nodo);
            }
        }
예제 #6
0
        private void AdicionaRutaPendientes(ref List <NodoGrafo> rutaActual, ref Stack <List <NodoGrafo> > rutasPendientes)
        {
            List <NodoGrafo> rutaActualAux = null;
            NodoGrafo        nodoAux       = null;

            rutaActualAux = new List <NodoGrafo>(rutaActual.GetRange(0, rutaActual.Count - 1).ToList());
            nodoAux       = rutaActualAux.Last();
            if (nodoAux.arcos != null && nodoAux.arcos.Count > 1)
            {
                foreach (Arco a in nodoAux.arcos.GetRange(1, nodoAux.arcos.Count - 1).ToList())
                {
                    rutaActualAux = new List <NodoGrafo>(rutaActual.GetRange(0, rutaActual.Count - 1).ToList());
                    rutaActualAux.Add(a.nodo);
                    rutasPendientes.Push(rutaActualAux);
                }
            }
        }
예제 #7
0
        private NodoGrafo ObtenerNodo(string label)
        {
            NodoGrafo         nodoAux         = null;
            Stack <NodoGrafo> nodosPendientes = null;

            if (!estaVacio())
            {
                nodosPendientes = new Stack <NodoGrafo>();
                nodosPendientes.Push(inicio);
                while (true)
                {
                    if (nodosPendientes.Any())
                    {
                        nodoAux = nodosPendientes.Pop();
                        if (nodoAux.label.ToUpper().Equals(label.ToUpper())) //Se encontro el nodo
                        {
                            if (label.ToUpper().Equals("B"))
                            {
                                // Console.WriteLine($"hashcode: {nodoAux.GetHashCode()}");
                                // Console.WriteLine($"count: {((nodoAux.arcos!=null) ? nodoAux.arcos.Count.ToString() : "nulo")}");
                                // Console.WriteLine($"l2: {nodoAux.l2}");
                            }
                            break;
                        }
                        else if (nodoAux.arcos != null && nodoAux.arcos.Count > 0)
                        {
                            foreach (Arco a in nodoAux.arcos)
                            {
                                nodosPendientes.Push(a.nodo);
                            }
                        }
                    }
                    else  //Termino de recorrer el grafo y no se encontro
                    {
                        nodoAux = null;
                        break;
                    }
                }
            }

            return(nodoAux);
        }
예제 #8
0
        public void InsertarRelacionarNodo(string labelPredecesor, string labelNodo, int peso)
        {
            NodoGrafo nodo           = null;
            NodoGrafo nodoPredecesor = null;

            nodo = new NodoGrafo(labelNodo);
            if (labelPredecesor == null && estaVacio())
            {
                inicio = nodo;
            }
            else if (!estaVacio() && existeNodo(labelPredecesor))
            {
                Console.WriteLine($"\t{labelPredecesor} - {labelNodo}({peso})");
                if (existeNodo(labelNodo))
                {
                    nodo = ObtenerNodo(labelNodo);
                }
                nodoPredecesor = ObtenerNodo(labelPredecesor);
                relacionarNodo(nodoPredecesor, nodo, peso);
            }
        }
예제 #9
0
        public void MostrarGrafo()
        {
            NodoGrafo         nodoAux         = null;
            Queue <NodoGrafo> nodosPendientes = null;

            if (!estaVacio())
            {
                nodosPendientes = new Queue <NodoGrafo>();
                nodosPendientes.Enqueue(inicio);
                while (nodosPendientes.Any())
                {
                    nodoAux = nodosPendientes.Dequeue();
                    mostrarNodoRelaciones(nodoAux, nodosPendientes.Any());
                    foreach (NodoGrafo n in nodoAux.arcos ?? Enumerable.Empty <NodoGrafo>())
                    {
                        if (!nodosPendientes.Any(x => x.label.ToUpper().Equals(n.label.ToUpper()))) //No permite encolar ya encolados, asi se evita mostrar nodos–predecesores ya mostrados
                        {
                            nodosPendientes.Enqueue(n);
                        }
                    }
                }
            }
        }
예제 #10
0
        private NodoGrafo ObtenerNodo(string label)
        {
            NodoGrafo         nodoAux         = null;
            Stack <NodoGrafo> nodosPendientes = null;

            if (!estaVacio())
            {
                nodosPendientes = new Stack <NodoGrafo>();
                nodosPendientes.Push(inicio);
                while (true)
                {
                    if (nodosPendientes.Any())
                    {
                        nodoAux = nodosPendientes.Pop();
                        if (nodoAux.label.ToUpper().Equals(label.ToUpper())) //Se encontro el nodo
                        {
                            break;
                        }
                        else if (nodoAux.arcos != null && nodoAux.arcos.Count > 0)
                        {
                            foreach (NodoGrafo n in nodoAux.arcos)
                            {
                                nodosPendientes.Push(n);
                            }
                        }
                    }
                    else  //Termino de recorrer el grafo y no se encontro
                    {
                        nodoAux = null;
                        break;
                    }
                }
            }

            return(nodoAux);
        }
예제 #11
0
 public Grafo()
 {
     this.inicio        = null;
     this.cantidadNodos = 0;
 }
예제 #12
0
 private int obtenerPesoArco(NodoGrafo nodoPredecesor, NodoGrafo nodo)
 {
     return(nodoPredecesor.arcos.Where(x => x.nodo == nodo).First().peso);
 }