예제 #1
0
        public bool AlgoritmoManualBotello(Grafo grafo1, Grafo grafo2)
        {
            SaveFileDialog VentanaGuardar  = new SaveFileDialog();
            string         CadenaAEscribir = "";
            string         Ruta            = "";
            int            SumaColumna     = 0;

            int[,] MatrizU = grafo1.GeneraMatrizAdyacencia();
            int[,] MatrizV = grafo2.GeneraMatrizAdyacencia();
            List <int> ArregloGradosSalidaColumna;

            VentanaGuardar.Filter = "Texto (*.txt)|*.txt";
            MessageBox.Show("Por favor selecciona donde guardar el resultado");
            if (VentanaGuardar.ShowDialog() == DialogResult.OK)
            {
                Ruta = VentanaGuardar.FileName;
            }

            if ((grafo1.Nodos.Count == grafo2.Nodos.Count) && (grafo1.ObtenNumeroRelaciones() == grafo2.ObtenNumeroRelaciones())) // Si tenemos el mismo número de relaciones y nodos
            {
                for (int i = 0; i < grafo1.Nodos.Count - 1; i++)
                {
                    ArregloGradosSalidaColumna = new List <int>();
                    SumaColumna = grafo1.ObtenGradoEntradaNodo(grafo1.Nodos[i]);
                    for (int j = 0; j < grafo1.Nodos.Count; j++)
                    {
                        if (MatrizU[j, i] == 1)
                        {
                            int NumAuxGrados = 0;
                            for (int z = 0; z < grafo1.Nodos.Count; z++)
                            {
                                NumAuxGrados += MatrizU[z, j];
                            }
                            ArregloGradosSalidaColumna.Add(NumAuxGrados);
                        }
                    }
                    int ColSim = BuscaColumnaSimilar(SumaColumna, i + 1, MatrizV, grafo2, ArregloGradosSalidaColumna);
                    if (ColSim != 0)
                    {
                        CadenaAEscribir += "Comparando con la columna: " + (i + 1) + " de la matriz 1 \n" + "Columna Similar encontrada: " + (ColSim + 1) + " en la matriz 2 " + "\n";
                        intercambiaColumnna(i, ColSim, MatrizV, grafo1.Nodos.Count);
                        intercambiaRenglon(i, ColSim, MatrizV, grafo1.Nodos.Count);
                        CadenaAEscribir += "\nNueva Matriz: \n" + FormateaMatrizaCadena(MatrizV) + "\n";
                        if (ComparaMatrices(MatrizU, MatrizV, grafo1.Nodos.Count))
                        {
                            CadenaAEscribir += "\n\nLos grafos son isomorfos";
                            using (StreamWriter Escritor = new StreamWriter(Ruta))
                            {
                                Escritor.WriteLine(CadenaAEscribir);
                            }
                            return(true);
                        }
                    }
                    else
                    {
                        CadenaAEscribir += "No se encontaron coincidencias con la columna: " + (i + 1) + " de la matriz 1\n";
                    }
                }
            }
            else
            {
                MessageBox.Show("Los grafos no tienen el mismo número de nodos o el mismo número de relaciones!!!!");
            }
            CadenaAEscribir += "\n Los grafos no son isomorfos";
            using (StreamWriter Escritor = new StreamWriter(Ruta))
            {
                Escritor.WriteLine(CadenaAEscribir);
            }
            return(false);
        }
예제 #2
0
        public int BuscaColumnaSimilar(int GradoColumna, int PosicionColumna, int[,] Matriz, Grafo grafo, List <int> GradosSalida)
        {
            bool Bandera;
            //En los renglones tenemos que obtener el grado de salida del nodo en la posición del renglón seleccionado
            //En la columna tenemos que obtener el grado de entrada del nodo
            int        TamañoMatriz  = grafo.Nodos.Count;
            List <int> ListaAuxiliar = new List <int>();

            for (int i = PosicionColumna; i < TamañoMatriz; i++)
            {
                if (grafo.ObtenGradoEntradaNodo(grafo.Nodos[i]) == GradoColumna)
                {
                    Bandera = true;
                    for (int j = 0; j < grafo.Nodos.Count; j++)
                    {
                        if (Matriz[j, i] == 1)
                        {
                            int NumAuxgrados = 0;
                            for (int z = 0; z < grafo.Nodos.Count; z++)
                            {
                                NumAuxgrados += Matriz[z, j];
                            }
                            ListaAuxiliar.Add(NumAuxgrados);
                        }
                    }
                    ListaAuxiliar.Sort();
                    GradosSalida.Sort();
                    for (int z = 0; z < ListaAuxiliar.Count; z++)
                    {
                        if (ListaAuxiliar[z] != GradosSalida[z])
                        {
                            Bandera = false;
                        }
                    }
                    ListaAuxiliar.Clear();
                    if (Bandera)
                    {
                        return(i);
                    }
                }
            }
            return(0);
        }