//Algoritmo de matrices de G y H
        public bool algoritmoMatrices()
        {
            bool isomorficos = false,continua = true;
            int colG = 0, n = G.getListaAdyacencia().Count;

            CMatrizAdyacencia MG = G.getMatrizAdyacencia();
            CMatrizAdyacencia MH = new CMatrizAdyacencia(n);
            MH.setMatriz(copiaMatriz(H.getMatrizAdyacencia().getMatriz(), n));

            while (colG < n && continua)
            {
                if (encuentraSemejante(MG, ref MH, colG, n))
                {
                    if (matricesIguales(MG, MH, n))
                    {
                        isomorficos = true;
                        continua = false;
                    }
                    else
                        colG++;
                }
                else
                    continua = false;
            }

            if (colG == n || !matricesIguales(MG, MH,n))//Si se recorrieron todas las columnas de G
            {
                isomorficos = false;
            }

            return isomorficos;
        }
        public bool encuentraSemejante(CMatrizAdyacencia m1, ref CMatrizAdyacencia m2, int col_m1, int n)
        {
            int  ic2       = col_m1 + 1;
            bool semejante = false;

            if (ic2 == n)
            {
                ic2 = 0;
            }

            while (col_m1 != ic2)
            {
                if ((semejante = columnaYRenglonesIguales(m1, m2, col_m1, ic2, n)))
                {
                    aplicarIntercambioDeFilasYColumnas(ref m2, col_m1, ic2, n);
                    return(semejante);
                }

                ic2++;
                if (ic2 == n)
                {
                    ic2 = 0;
                }
            }

            return(semejante);
        }
        public Propiedades(List <CNodoVertice> lady, List <CArista> lari, CMatrizAdyacencia mady, CMatrizIncidencia mind, int na, int nv)
        {
            InitializeComponent();
            DataTable mat_ady = new DataTable();
            DataTable mat_inc = new DataTable();

            object[] values  = new object[lady.Count];
            object[] values2 = new object[lari.Count];

            int cont = 1;

            foreach (CNodoVertice cnv in lady)
            {
                mat_ady.Columns.Add("V" + cnv.getVertice().getId(), typeof(int));
            }

            foreach (CArista ar in lari)
            {
                mat_inc.Columns.Add("E" + cont.ToString(), typeof(int));
                cont++;
            }


            for (int i = 0; i < lady.Count; i++)
            {
                for (int j = 0; j < lady.Count; j++)
                {
                    values[j] = mady.getMatriz()[i, j];
                }

                mat_ady.Rows.Add(values);
            }

            for (int i = 0; i < lady.Count; i++)
            {
                for (int j = 0; j < lari.Count; j++)
                {
                    values2[j] = mind.getMatriz()[i, j];
                }

                mat_inc.Rows.Add(values2);
            }

            this.NAristasLabel.Text  += na.ToString();
            this.NVerticesLabel.Text += nv.ToString();

            DGMatrizA.DataSource = mat_ady;
            DGMatrizI.DataSource = mat_inc;
        }
        } //Valida matrices isomorficas

        public bool columnaYRenglonesIguales(CMatrizAdyacencia m1, CMatrizAdyacencia m2, int col_m1, int col_m2, int n)
        {
            bool       iguales = false;
            int        num_unos_columna_m1 = 0, num_unos_columna_m2 = 0;
            List <int> nuef_m1 = new List <int>();
            List <int> nuef_m2 = new List <int>();

            num_unos_columna_m1 = calculaUnosColumna(m1.getMatriz(), col_m1, n, ref nuef_m1);
            num_unos_columna_m2 = calculaUnosColumna(m2.getMatriz(), col_m2, n, ref nuef_m2);

            if (num_unos_columna_m1 == num_unos_columna_m2 && igualNuef(nuef_m1, nuef_m2))
            {
                iguales = true;
            }

            return(iguales);
        }
        public bool matricesIguales(CMatrizAdyacencia m1, CMatrizAdyacencia m2, int tam_mat)
        {
            bool band = true;

            for (int fila = 0; fila < tam_mat && band != false; fila++)
            {
                for (int columna = 0; columna < tam_mat; columna++)
                {
                    if (m1.getMatriz()[fila, columna] != m2.getMatriz()[fila, columna])
                    {
                        band = false;
                        break;
                    }
                }
            }

            return(band);
        } //Valida matrices isomorficas
        public void aplicarIntercambioDeFilasYColumnas(ref CMatrizAdyacencia m, int col_m1, int col_m2, int n)
        {
            int[,] maux = copiaMatriz(m.getMatriz(), n);

            //Cambio columnas
            for (int i = 0; i < n; i++)
            {
                m.getMatriz()[i, col_m1] = maux[i, col_m2];
                m.getMatriz()[i, col_m2] = maux[i, col_m1];
            }

            maux = copiaMatriz(m.getMatriz(), n);

            //Cambio renglones
            for (int i = 0; i < n; i++)
            {
                m.getMatriz()[col_m1, i] = maux[col_m2, i];
                m.getMatriz()[col_m2, i] = maux[col_m1, i];
            }
        }
        public void aplicarIntercambioDeFilasYColumnas(ref CMatrizAdyacencia m, int col_m1,int col_m2, int n)
        {
            int[,] maux = copiaMatriz(m.getMatriz(), n);

            //Cambio columnas
            for (int i = 0; i < n; i++)
            {
                m.getMatriz()[i, col_m1] = maux[i, col_m2];
                m.getMatriz()[i, col_m2] = maux[i, col_m1];
            }

            maux = copiaMatriz(m.getMatriz(), n);

            //Cambio renglones
            for (int i = 0; i < n; i++)
            {
                m.getMatriz()[col_m1, i] = maux[col_m2, i];
                m.getMatriz()[col_m2, i] = maux[col_m1, i];
            }
        }
        public Propiedades(List<CNodoVertice> lady,List<CArista> lari, CMatrizAdyacencia mady,CMatrizIncidencia mind,int na,int nv)
        {
            InitializeComponent();
            DataTable mat_ady = new DataTable();
            DataTable mat_inc = new DataTable();
            object[] values = new object[lady.Count];
            object[] values2 = new object[lari.Count];

            int cont = 1;

            foreach (CNodoVertice cnv in lady)
                mat_ady.Columns.Add("V" + cnv.getVertice().getId(), typeof(int));

            foreach (CArista ar in lari)
            {
                mat_inc.Columns.Add("E"+cont.ToString(), typeof(int));
                cont++;
            }

            for (int i = 0; i < lady.Count; i++)
            {
                for (int j = 0; j < lady.Count; j++)
                    values[j] = mady.getMatriz()[i, j];

                mat_ady.Rows.Add(values);
            }

            for (int i = 0; i < lady.Count; i++)
            {
                for (int j = 0; j < lari.Count; j++)
                    values2[j] = mind.getMatriz()[i, j];

                mat_inc.Rows.Add(values2);
            }

            this.NAristasLabel.Text += na.ToString();
            this.NVerticesLabel.Text += nv.ToString();

            DGMatrizA.DataSource = mat_ady;
            DGMatrizI.DataSource = mat_inc;
        }
        //Algoritmo de matrices de G y H
        public bool algoritmoMatrices()
        {
            bool isomorficos = false, continua = true;
            int  colG = 0, n = G.getListaAdyacencia().Count;

            CMatrizAdyacencia MG = G.getMatrizAdyacencia();
            CMatrizAdyacencia MH = new CMatrizAdyacencia(n);

            MH.setMatriz(copiaMatriz(H.getMatrizAdyacencia().getMatriz(), n));

            while (colG < n && continua)
            {
                if (encuentraSemejante(MG, ref MH, colG, n))
                {
                    if (matricesIguales(MG, MH, n))
                    {
                        isomorficos = true;
                        continua    = false;
                    }
                    else
                    {
                        colG++;
                    }
                }
                else
                {
                    continua = false;
                }
            }

            if (colG == n || !matricesIguales(MG, MH, n))//Si se recorrieron todas las columnas de G
            {
                isomorficos = false;
            }

            return(isomorficos);
        }
        public bool matricesIguales(CMatrizAdyacencia m1, CMatrizAdyacencia m2,int tam_mat)
        {
            bool band = true;

            for (int fila = 0; fila < tam_mat && band !=  false; fila++)
            {
                for (int columna = 0; columna < tam_mat; columna++)
                {
                    if (m1.getMatriz()[fila, columna] != m2.getMatriz()[fila, columna])
                    {
                        band = false;
                        break;
                    }
                }
            }

            return band;
        }
        public bool encuentraSemejante(CMatrizAdyacencia m1,ref CMatrizAdyacencia m2, int col_m1,int n)
        {
            int ic2 = col_m1 + 1;
            bool semejante = false;

            if (ic2 == n)
                ic2 = 0;

            while (col_m1 != ic2)
            {
                if ((semejante = columnaYRenglonesIguales(m1, m2, col_m1, ic2, n)))
                {
                    aplicarIntercambioDeFilasYColumnas(ref m2, col_m1, ic2, n);
                    return semejante;
                }

                ic2++;
                if (ic2 == n)
                    ic2 = 0;
            }

            return semejante;
        }
        public bool columnaYRenglonesIguales(CMatrizAdyacencia m1, CMatrizAdyacencia m2, int col_m1, int col_m2, int n)
        {
            bool iguales = false;
            int num_unos_columna_m1 = 0, num_unos_columna_m2 = 0;
            List<int> nuef_m1 = new List<int>();
            List<int> nuef_m2 = new List<int>();

            num_unos_columna_m1 = calculaUnosColumna(m1.getMatriz(), col_m1, n, ref nuef_m1);
            num_unos_columna_m2 = calculaUnosColumna(m2.getMatriz(), col_m2, n, ref nuef_m2);

            if (num_unos_columna_m1 == num_unos_columna_m2 && igualNuef(nuef_m1,nuef_m2))
                iguales = true;

            return iguales;
        }