Пример #1
0
        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);
        }
Пример #2
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);
        }