public static Dictionary <string, string> busquedaAAsterisco(Dictionary <string, List <Tuple <string, int> > > grafo, double limite_de_costo, List <Node> nodos, string str_nodo_inicial, string str_nodo_final)
        {
            Dictionary <string, string> resultado             = new Dictionary <string, string>();
            PriorityQueue <double, ArbolNario <string> > cola = new PriorityQueue <double, ArbolNario <string> >();
            List <ArbolNario <string> > nodos_expandidos      = new List <ArbolNario <string> >();
            List <double> costos_exedidos_del_limite          = new List <double>();
            double        f;
            string        str_res = "";

            Dictionary <string, double> distancias = calcularDistancias(nodos, getNodoFromList(nodos, str_nodo_final));

            cola.Add(new KeyValuePair <double, ArbolNario <string> >(distancias[str_nodo_inicial], new ArbolNario <string>(str_nodo_inicial)));

            while (!cola.IsEmpty)
            {
                ArbolNario <string> nodo = cola.DequeueValue();
                if (esMeta(nodo, str_nodo_final))
                {
                    str_res += nodo.Dato;
                    resultado.Add("ruta", getStringReverse(getRuta(nodo)));
                    resultado.Add("nodos_visitados", str_res);
                    return(resultado);
                }

                // Marcamos como visitado
                nodos_expandidos.Add(nodo);
                str_res += nodo.Dato;

                // Expandimos
                foreach (Tuple <string, int> vecino in grafo[nodo.Dato])
                {
                    ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1);
                    nodo.addChild(nodo_vecino);
                    nodo_vecino.CostoRuta += nodo.CostoRuta + vecino.Item2;
                    if (!contieneNodo(nodos_expandidos, nodo_vecino))
                    {
                        f = TruncateDecimal(nodo_vecino.CostoRuta + distancias[nodo_vecino.Dato], 4);
                        if (f <= limite_de_costo)
                        {
                            cola.Add(new KeyValuePair <double, ArbolNario <string> >(f, nodo_vecino));
                        }
                        else
                        {
                            costos_exedidos_del_limite.Add(f);
                        }
                    }
                }
            }

            resultado.Add("ruta", "No hay camino.");
            resultado.Add("nodos_visitados", "No hay camino.");
            resultado.Add("nuevo_limite_de_costo", getMinimoFromList(costos_exedidos_del_limite).ToString());
            return(resultado);
        }
        public static Dictionary <string, string> busquedaPreferentePorAmplitud(Dictionary <string, List <Tuple <string, int> > > grafo, string str_nodo_inicial, string str_nodo_final)
        {
            Dictionary <string, string>  resultado        = new Dictionary <string, string>();
            Queue <ArbolNario <string> > cola             = new Queue <ArbolNario <string> >();
            List <ArbolNario <string> >  nodos_expandidos = new List <ArbolNario <string> >();
            ArbolNario <string>          nodo;
            string str_res = "";

            nodo = new ArbolNario <string>(str_nodo_inicial);
            cola.Enqueue(nodo);
            nodos_expandidos.Add(nodo);

            while (cola.Count != 0)
            {
                nodo = cola.Dequeue();
                if (esMeta(nodo, str_nodo_final))
                {
                    str_res += nodo.Dato;
                    resultado.Add("ruta", getStringReverse(getRuta(nodo)));
                    resultado.Add("nodos_visitados", str_res);
                    return(resultado);
                }

                // Marcamos como visitado
                str_res += nodo.Dato;

                // Expandimos
                foreach (Tuple <string, int> vecino in grafo[nodo.Dato])
                {
                    ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1);
                    nodo.addChild(nodo_vecino);
                    if (!contieneNodo(nodos_expandidos, nodo_vecino))
                    {
                        cola.Enqueue(nodo_vecino);
                        nodos_expandidos.Add(nodo_vecino);
                    }
                }
            }
            resultado.Add("ruta", "No hay camino.");
            resultado.Add("nodos_visitados", "No hay camino.");
            return(resultado);
        }
        public static Dictionary <string, string> busquedaAvara(Dictionary <string, List <Tuple <string, int> > > grafo, List <Node> nodos, string str_nodo_inicial, string str_nodo_final)
        {
            Dictionary <string, string> resultado             = new Dictionary <string, string>();
            PriorityQueue <double, ArbolNario <string> > cola = new PriorityQueue <double, ArbolNario <string> >();
            List <ArbolNario <string> > nodos_expandidos      = new List <ArbolNario <string> >();
            string str_res = "";

            Dictionary <string, double> distancias = calcularDistancias(nodos, getNodoFromList(nodos, str_nodo_final));

            cola.Add(new KeyValuePair <double, ArbolNario <string> >(distancias[str_nodo_inicial], new ArbolNario <string>(str_nodo_inicial)));

            while (!cola.IsEmpty)
            {
                ArbolNario <string> nodo = cola.DequeueValue();
                if (esMeta(nodo, str_nodo_final))
                {
                    str_res += nodo.Dato;
                    resultado.Add("ruta", getStringReverse(getRuta(nodo)));
                    resultado.Add("nodos_visitados", str_res);
                    return(resultado);
                }

                // Marcamos como visitado
                nodos_expandidos.Add(nodo);
                str_res += nodo.Dato;

                // Expandimos
                foreach (Tuple <string, int> vecino in grafo[nodo.Dato])
                {
                    ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1);
                    nodo.addChild(nodo_vecino);
                    if (!contieneNodo(nodos_expandidos, nodo_vecino))
                    {
                        cola.Add(new KeyValuePair <double, ArbolNario <string> >(distancias[nodo_vecino.Dato], nodo_vecino));
                    }
                }
            }
            resultado.Add("ruta", "No hay camino.");
            resultado.Add("nodos_visitados", "No hay camino.");
            return(resultado);
        }
        public static Dictionary <string, string> busquedaPorCostoUniforme(Dictionary <string, List <Tuple <string, int> > > grafo, string str_nodo_inicial, string str_nodo_final)
        {
            Dictionary <string, string> resultado          = new Dictionary <string, string>();
            PriorityQueue <int, ArbolNario <string> > cola = new PriorityQueue <int, ArbolNario <string> >();
            List <ArbolNario <string> > nodos_expandidos   = new List <ArbolNario <string> >();
            string str_res = "";

            cola.Add(new KeyValuePair <int, ArbolNario <string> >(0, new ArbolNario <string>(str_nodo_inicial)));

            while (!cola.IsEmpty)
            {
                ArbolNario <string> nodo = cola.DequeueValue();
                if (esMeta(nodo, str_nodo_final))
                {
                    str_res += nodo.Dato;
                    resultado.Add("ruta", getStringReverse(getRuta(nodo)));
                    resultado.Add("nodos_visitados", str_res);
                    return(resultado);
                }

                // Marcamos como visitado
                nodos_expandidos.Add(nodo);
                str_res += nodo.Dato;

                // Expandimos
                foreach (Tuple <string, int> vecino in grafo[nodo.Dato])
                {
                    ArbolNario <string> nodo_vecino = new ArbolNario <string>(vecino.Item1);
                    nodo.addChild(nodo_vecino);
                    nodo_vecino.CostoRuta = nodo.CostoRuta + vecino.Item2;
                    if (!contieneNodo(nodos_expandidos, nodo_vecino))
                    {
                        cola.Add(new KeyValuePair <int, ArbolNario <string> >(nodo_vecino.CostoRuta, nodo_vecino));
                    }
                }
            }
            resultado.Add("ruta", "No hay camino.");
            resultado.Add("nodos_visitados", "No hay camino.");
            return(resultado);
        }