public Isomorfismo(Grafo a, Grafo b) { //Cargar todos los datos de los grafos en las vistas this.grafo_a = a; this.grafo_b = b; InitializeComponent(); grafo_a.generaMatriz_Adaycencia(); grafo_b.generaMatriz_Adaycencia(); data_matriz_a.Columns.Clear(); data_matriz_a.Rows.Clear(); int[,] array = new int[grafo_a.list_vertice.Count() + 1, grafo_a.list_vertice.Count() + 1]; for (int i = 0; i < grafo_a.list_vertice.Count(); i++) { for (int j = 0; j < grafo_a.list_vertice.Count(); j++) { array[i, j] = 0; } } foreach (Arista aris in grafo_a.list_arista) { array[aris.origen.indice_vertice, aris.destino.indice_vertice] = 1; array[aris.destino.indice_vertice, aris.origen.indice_vertice] = 1; } data_matriz_a.Columns.Add("Index", ""); for (int i = 0; i < array.GetLength(1) - 1; i++) { data_matriz_a.Columns.Add("Value", i.ToString()); } for (int i = 0; i < grafo_a.list_vertice.Count(); i++) { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(data_matriz_a); for (int j = 0; j < grafo_a.list_vertice.Count(); j++) { if (j == 0) { row.Cells[j].Value = i.ToString(); } row.Cells[j + 1].Value = array[i, j].ToString(); } data_matriz_a.Rows.Add(row); } data_matriz_b.Columns.Clear(); data_matriz_b.Rows.Clear(); array = new int[grafo_b.list_vertice.Count() + 1, grafo_b.list_vertice.Count() + 1]; for (int i = 0; i < grafo_b.list_vertice.Count(); i++) { for (int j = 0; j < grafo_b.list_vertice.Count(); j++) { array[i, j] = 0; } } foreach (Arista aris in grafo_b.list_arista) { array[aris.origen.indice_vertice, aris.destino.indice_vertice] = 1; array[aris.destino.indice_vertice, aris.origen.indice_vertice] = 1; } data_matriz_b.Columns.Add("Index", ""); for (int i = 0; i < array.GetLength(1) - 1; i++) { data_matriz_b.Columns.Add("Value", i.ToString()); } for (int i = 0; i < grafo_b.list_vertice.Count(); i++) { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(data_matriz_b); for (int j = 0; j < grafo_b.list_vertice.Count(); j++) { if (j == 0) { row.Cells[j].Value = i.ToString(); } row.Cells[j + 1].Value = array[i, j].ToString(); } data_matriz_b.Rows.Add(row); } indice_grafo_label_a.Text = "Indice de Grafo: " + grafo_a.indice_grafo.ToString(); num_vertices_a.Text = "Numero de Vertices: " + grafo_a.list_vertice.Count(); num_aristas_a.Text = "Numero de Aristas: " + grafo_a.list_arista.Count(); indice_grafo_label_b.Text = "Indice de Grafo: " + grafo_b.indice_grafo.ToString(); num_vertices_b.Text = "Numero de Vertices: " + grafo_b.list_vertice.Count(); num_aristas_b.Text = "Numero de Aristas: " + grafo_b.list_arista.Count(); //Prueba de biyeccion a los grafos para verificar isomorfismo if (biyeccion(grafo_a, grafo_b)) { MessageBox.Show("SON ISOMORFICOS"); } else { MessageBox.Show("NO SON ISOMORFICOS"); } }
//Funcion de isomorfismo por fuerza bruta public bool isomorfismo_fuerza_bruta(Grafo g1, Grafo g2) { if (g1 != null && g2 != null) { if (g1.list_vertice.Count == g2.list_vertice.Count) { if (g1.list_arista.Count == g2.list_arista.Count) { int tam = g1.list_vertice.Count; g1.generaMatriz_Adaycencia(); int[,] matrizGrafo1 = g1.array_adyacencia; g2.generaMatriz_Adaycencia(); int[,] matrizGrafo2 = g2.array_adyacencia; if (comparaMatriz(matrizGrafo1, matrizGrafo2, tam)) { MessageBox.Show("Las Matrices son Iguales"); return(true); } else { long[] fact = { 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800, 39916800 }; int count = g1.list_vertice.Count; int[] indexp = new int[count]; for (int i = 0; i < count; i++) { indexp[i] = i; } for (int i = 0; i < fact[count - 1]; i++) { siguientePermutacion(indexp); string Aux = ""; for (int z = 0; z < indexp.GetLength(0); z++) { Aux += "{" + (z + 1) + " , " + (indexp[z] + 1) + "} "; } if (PruebaPermutacion(matrizGrafo1, matrizGrafo2, indexp)) { MessageBox.Show("Las Matrices fueron sometidas a fuerza bruta y son iguales"); return(true); } } } } else { MessageBox.Show("Numero de aristas diferente"); return(false); } } else { MessageBox.Show("Numero de vertices diferente"); return(false); } } else { MessageBox.Show("Uno o ambos nodos sobn Nulos"); return(false); } return(false); }
public bool biyeccion(Grafo grafo1, Grafo grafo2) { int sumaColumna = 0; //Generar matrices de adyacencia grafo1.generaMatriz_Adaycencia(); grafo2.generaMatriz_Adaycencia(); int[,] MatrizU = grafo1.array_adyacencia; int[,] MatrizV = grafo2.array_adyacencia; List <int> arregloGradosSalidaColumna; if ((grafo1.list_vertice.Count == grafo2.list_vertice.Count)) // Si tenemos el mismo número de relaciones y nodos { if (grafo1.list_arista.Count == grafo2.list_arista.Count) // Si tenemos el mismo número de relaciones y nodos { for (int i = 0; i < grafo1.list_vertice.Count - 1; i++) // Calcula los grados { arregloGradosSalidaColumna = new List <int>(); sumaColumna = grafo1.obtenGradoEntradaNodo(grafo1.list_vertice[i]); for (int j = 0; j < grafo1.list_vertice.Count; j++) { if (MatrizU[j, i] == 1) { int NumAuxGrados = 0; for (int z = 0; z < grafo1.list_vertice.Count; z++) { NumAuxGrados += MatrizU[z, j]; } arregloGradosSalidaColumna.Add(NumAuxGrados); } } int colSim = buscaColumnaSimilar(sumaColumna, i + 1, MatrizV, grafo2, arregloGradosSalidaColumna); if (colSim != 0) { //Permutar columnas con filas intercambiaColumnna(i, colSim, MatrizV, grafo1.list_vertice.Count); intercambiaRenglon(i, colSim, MatrizV, grafo1.list_vertice.Count); if (comparaMatrices(MatrizU, MatrizV, grafo1.list_vertice.Count)) { ady_biy_resultante.Columns.Add("Index", ""); for (int j = 0; j < MatrizV.GetLength(1) - 1; j++) { ady_biy_resultante.Columns.Add("Value", ""); } for (int k = 0; k < grafo2.list_vertice.Count(); k++) { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(ady_biy_resultante); for (int j = 0; j < grafo2.list_vertice.Count(); j++) { row.Cells[j].Value = MatrizV[k, j].ToString(); } ady_biy_resultante.Rows.Add(row); } MessageBox.Show("Grafo V recorrido por biyeccion y las matrices coinciden"); return(true); } } } } else { MessageBox.Show("Los grafos no tienen el mismo número de aristas!!!!"); return(false); } } else { MessageBox.Show("Los grafos no tienen el mismo número de nodos!!!!"); return(false); } return(false); }