public int buscaColumnaSimilar(int GradoColumna, int PosicionColumna, int[,] Matriz, Grafo grafo, List <int> GradosSalida) { bool Bandera; int TamañoMatriz = grafo.list_vertice.Count; List <int> ListaAuxiliar = new List <int>(); for (int i = PosicionColumna; i < TamañoMatriz; i++) { if (grafo.obtenGradoEntradaNodo(grafo.list_vertice[i]) == GradoColumna) { Bandera = true; for (int j = 0; j < grafo.list_vertice.Count; j++) { if (Matriz[j, i] == 1) { int NumAuxgrados = 0; for (int z = 0; z < grafo.list_vertice.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); }
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); }