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); }
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); }