static void Main(string[] args)
        {
            //raiz
            var GrafoI1 = new Dictionary <string, string>();
            var GrafoI2 = new Dictionary <string, string>();

            string Grado1 = "";
            string Grado2 = "";

            bool menu = true;

            while (menu)
            {
                try
                {
                    Console.WriteLine("Coloque sobre la consola el primer grafo");

                    //leemos ruta del primer grafo
                    string Ruta_Primer_Grafo = Console.ReadLine();
                    //Accedemos al archivo y lo leemos completo
                    var File1 = new StreamReader(Ruta_Primer_Grafo);
                    //
                    var aux1 = File1.ReadLine();
                    var PrimerGrafoEnSetring = string.Empty;
                    while (aux1 != null)
                    {
                        PrimerGrafoEnSetring += aux1 + "-";
                        aux1 = File1.ReadLine();
                    }
                    File1.Close();
                    Console.Clear();

                    Console.WriteLine("Coloque sobre la consola el segundo grafo");
                    //leemos ruta del primer grafo
                    var ruta2 = Console.ReadLine();
                    //Accedemos al archivo y lo leemos completo
                    var File2 = new StreamReader(ruta2);
                    var aux2  = File2.ReadLine();
                    var SegundoGrafoEnSetring = string.Empty;
                    while (aux2 != null)
                    {
                        SegundoGrafoEnSetring += aux2 + "-";
                        aux2 = File2.ReadLine();
                    }

                    File2.Close();
                    var Nombre1 = Path.GetFileName(Ruta_Primer_Grafo);
                    var Nombre2 = Path.GetFileName(ruta2);
                    Console.Clear();
                    //separar por saltos de linea
                    //Le enviamos un diccionario Vacio
                    PrimerGrafoEnSetring  = PrimerGrafoEnSetring.ToUpper();
                    SegundoGrafoEnSetring = SegundoGrafoEnSetring.ToUpper();
                    GrafoI1 = Clasificar(PrimerGrafoEnSetring.Substring(0, PrimerGrafoEnSetring.Length - 1).Split('-'), new Dictionary <string, string>());
                    GrafoI2 = Clasificar(SegundoGrafoEnSetring.Substring(0, SegundoGrafoEnSetring.Length - 1).Split('-'), new Dictionary <string, string>());
                    //si tiene los mismo vertices
                    Grado1 = PrimerGrafoEnSetring.Substring(0, PrimerGrafoEnSetring.Length - 1).Split('-')[0];
                    Grado2 = SegundoGrafoEnSetring.Substring(0, SegundoGrafoEnSetring.Length - 1).Split('-')[0];
                    //var Tiene_MismasAristas = MismasAristas(Grafo1, Grafo2);
                    var Tiene_MismosVertices = MismosVertices(Grado1, Grado2);
                    var TieneMismoGrado      = MismoGradoYAristas(GrafoI1, GrafoI2);

                    if (Tiene_MismosVertices && TieneMismoGrado)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkGreen;
                        Console.BackgroundColor = ConsoleColor.White;
                        Console.WriteLine("Son isomorfos");
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.WriteLine($"{Nombre1} VS. {Nombre2}");
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.BackgroundColor = ConsoleColor.Black;

                        //si son isomorfos

                        FuncionDeIsomorfismo(GrafoI1, GrafoI2);
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                        Console.BackgroundColor = ConsoleColor.White;
                        Console.WriteLine("No son isomorfos");
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.BackgroundColor = ConsoleColor.Black;
                    }
                    Console.WriteLine("-------------------------------------------------");

                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Desea Continuar? \n No = N \n Si = S");
                    Console.ForegroundColor = ConsoleColor.White;
                    var romperciclo = Console.ReadLine();
                    if (romperciclo.ToLower() == "n")
                    {
                        break;
                    }
                    Console.Clear();
                }
                catch (Exception)
                {
                    Console.Clear();
                    Console.WriteLine("Error, Intente De Nuevo");
                }
            }

            void FuncionDeIsomorfismo(Dictionary <string, string> Grafo1, Dictionary <string, string> Grafo2)
            {
                bool monitor        = true;
                var  ArrayOrdenado1 = new KeyValuePair <string, string[]> [Grafo1.Count];
                var  ArrayOrdenado2 = new KeyValuePair <string, string[]> [Grafo1.Count];
                //LinQ
                var Grafo1Ordenado = from Nodo in Grafo1
                                     orderby Nodo.Value.Split(',').Length
                                     select Nodo;

                //LinQ
                var Grafo2Ordenado = from Nodo in Grafo2
                                     orderby Nodo.Value.Split(',').Length
                                     select Nodo;

                int contador = 0;

                foreach (var item in Grafo1Ordenado)
                {
                    ArrayOrdenado1[contador] = new KeyValuePair <string, string[]>(item.Key, item.Value.Split(','));
                    contador++;
                }
                contador = 0;
                foreach (var item in Grafo2Ordenado)
                {
                    ArrayOrdenado2[contador] = new KeyValuePair <string, string[]>(item.Key, item.Value.Split(','));
                    contador++;
                }

                Console.WriteLine("Funciones De Isomorfismo");

                for (int i = 0; i < ArrayOrdenado1.Length; i++)
                {
                    for (int j = 0; j < ArrayOrdenado2.Length; j++)
                    {
                        if (ArrayOrdenado2[j].Value != null)
                        {
                            if (ArrayOrdenado1[i].Value.Length == ArrayOrdenado2[j].Value.Length)
                            {
                                Console.Write("El Vertice del Grafo1 no: ");
                                Console.ForegroundColor = ConsoleColor.Green;
                                Console.WriteLine(ArrayOrdenado1[i].Key);
                                Console.ForegroundColor = ConsoleColor.White;
                                Console.Write("es equivalente al vertice no:");

                                Console.ForegroundColor = ConsoleColor.Blue;
                                Console.WriteLine(ArrayOrdenado2[j].Key);
                                Console.ForegroundColor = ConsoleColor.White;
                                Console.WriteLine("del Grafo2.");
                                Console.WriteLine("----------------------------------------------------------------");
                                ArrayOrdenado2[j] = new KeyValuePair <string, string[]>();
                                break;
                            }
                        }
                    }
                }
            }

            bool MismosVertices(string VerticesGRafo1, string VerticesGRafo2)
            {
                if (int.Parse(VerticesGRafo1) != int.Parse(VerticesGRafo2))
                {
                    return(false);
                }
                else

                {
                    return(true);
                }
            }

            bool MismoGradoYAristas(Dictionary <string, string> Grafo1, Dictionary <string, string> Grafo2)
            {
                bool monitor        = true;
                var  ArrayOrdenado1 = new KeyValuePair <string, int> [Grafo1.Count];
                var  ArrayOrdenado2 = new KeyValuePair <string, int> [Grafo1.Count];

                //LinQ
                var Grafo1Ordenado = from Nodo in Grafo1
                                     orderby Nodo.Value.Split(',').Length
                                     select Nodo;

                //LinQ
                var Grafo2Ordenado = from Nodo in Grafo2
                                     orderby Nodo.Value.Split(',').Length
                                     select Nodo;

                int contador = 0;

                foreach (var item in Grafo1Ordenado)
                {
                    ArrayOrdenado1[contador] = new KeyValuePair <string, int>(item.Key, item.Value.Split(',').Length);
                    contador++;
                }
                contador = 0;
                foreach (var item in Grafo2Ordenado)
                {
                    ArrayOrdenado2[contador] = new KeyValuePair <string, int>(item.Key, item.Value.Split(',').Length);
                    contador++;
                }
                for (int i = 0; i < Grafo1.Count; i++)
                {
                    if (ArrayOrdenado1[i].Value != ArrayOrdenado2[i].Value)
                    {
                        return(false);
                    }
                }
                return(monitor);
            }

            Dictionary <string, string> Clasificar(string[] array, Dictionary <string, string> Diccionario)
            {
                //para cada arreglo (valor en el array extraido del txt)
                foreach (var item in array)
                {
                    //Separacion por ","
                    var aux = item.Split(',');
                    if (item.Split(',').Length != 1)
                    {
                        //si el diccionario no contiene el vertice al cual agregar
                        if (!Diccionario.ContainsKey(aux[0]))
                        {
                            //agrega el nuevo indice con la aarista correspondiente
                            Diccionario.Add(aux[0], aux[1]);
                            if (Diccionario.ContainsKey(aux[1]))
                            {
                                //agrega el nuevo indice con la aarista correspondiente
                                Diccionario[aux[1]] += $",{aux[0]}";
                            }
                            else
                            {
                                //Crea el que no esta
                                Diccionario.Add(aux[1], aux[0]);
                            }
                        }
                        else
                        {
                            //Si La Tiene y agregga

                            Diccionario[aux[0]] += $",{aux[1]}";
                            if (!Diccionario.ContainsKey(aux[1]))
                            {
                                //Crea si no existe ,a pareja
                                Diccionario.Add(aux[1], aux[0]);
                            }
                            else
                            {
                                //Si existe, agrega la pareja correpondiente
                                Diccionario[aux[1]] += $",{aux[0]}";
                            }
                        }
                    }
                }

                return(Diccionario);
            }

            bool[,] LlenarMatriz(Dictionary <string, string> keyValuePair)
            {
                var Matriz = new bool[int.Parse(Grado1), int.Parse(Grado2)];

                foreach (var Y in keyValuePair)
                {
                    foreach (var X in Y.Value.Split(','))
                    {
                        var PosY = int.Parse(Y.Key);
                        var PosX = int.Parse(X);
                        Matriz[PosY, PosX] = true;
                        Matriz[PosY, PosX] = true;
                    }
                }

                return(Matriz);
            }
        }