예제 #1
0
        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);
        }
예제 #2
0
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            switch (TipoOperacion)
            {
            case -1:

                NodoMovimiento = BuscaNodo(e);
                if (NodoMovimiento != null)
                {
                    M = true;
                }
                break;

            case 0:
                Identificador++;
                Nodo Aux = new Nodo();
                Aux.AsignarCoordenadas(e.X, e.Y);
                Aux.Identificador = Identificador;
                grafo.AgregarNodo(Aux);
                Form1_Paint(this, null);
                break;

            case 1:
                Nodo aux = BuscaNodo(e);
                if (aux != null)
                {
                    if (MessageBox.Show("Estas seguro de eliminar el nodo : " + aux.Identificador + " ?", "Eliminar nodo", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        grafo.EliminarNodo(aux);
                        Form1_Paint(this, null);
                        Identificador--;
                    }
                }
                break;

            case 2:     // Agregar Relación
                NodoInicio = BuscaNodo(e);
                if (NodoInicio != null)
                {
                    R = true;
                }
                break;

            case 3:     // Mover Nodo
                NodoMovimiento = BuscaNodo(e);
                M = true;
                break;

            case 4:
                Arco Relacion = BuscaRelacion(e);
                if (Relacion != null)
                {
                    if (grafo.Dirigido == true)
                    {
                        grafo.EliminaRelacion(BuscaNodoInt(Relacion.Origen), BuscaNodoInt(Relacion.Destino));
                    }
                    else
                    {
                        if (Relacion.Origen != Relacion.Destino)
                        {
                            grafo.EliminaRelacion(BuscaNodoInt(Relacion.Origen), BuscaNodoInt(Relacion.Destino));
                            Arco RelAux = BuscaRelacionNodo(BuscaNodoInt(Relacion.Destino), Relacion.Origen);
                            grafo.EliminaRelacion(BuscaNodoInt(RelAux.Origen), BuscaNodoInt(RelAux.Destino));
                        }
                        else
                        {
                            grafo.EliminaRelacion(BuscaNodoInt(Relacion.Origen), BuscaNodoInt(Relacion.Destino));
                        }
                    }
                    Form1_Paint(this, null);
                }
                break;

            case 5:
                Arco RelacionPeso = BuscaRelacion(e);
                if (RelacionPeso != null)
                {
                    int Peso = Convert.ToInt32(Interaction.InputBox("Ingresa el nuevo peso de la relación: " + RelacionPeso.Origen + " - " + RelacionPeso.Destino));
                    if (grafo.Dirigido == true)
                    {
                        RelacionPeso.Peso = Peso;
                    }
                    else
                    {
                        Arco RelacionAuxiliarPeso = BuscaRelacionNodo(BuscaNodoInt(RelacionPeso.Destino), RelacionPeso.Origen);
                        RelacionPeso.Peso         = Peso;
                        RelacionAuxiliarPeso.Peso = Peso;
                    }
                }
                break;

            case 6:
                Nodo NodoAux = BuscaNodo(e);
                if (NodoAux != null)
                {
                    MessageBox.Show("El grado de salida del nodo es: " + NodoAux.ObtenGradoNodo().ToString() + "\n" + "El grado de entrada del nodo es: " + grafo.ObtenGradoEntradaNodo(NodoAux));
                }
                break;

            case 7:
                if (!banderaCamino)
                {
                    if (BuscaNodo(e) != null)
                    {
                        NodoCamino1 = BuscaNodo(e).Identificador;
                        LB_NodosSeleccionados.Text = "Nodo Seleccionado:\n" + NodoCamino1;
                        banderaCamino = true;
                        break;
                    }
                }
                if (banderaCamino)
                {
                    if (BuscaNodo(e) != null)
                    {
                        NodoCamino2   = BuscaNodo(e).Identificador;
                        banderaCamino = false;
                        LB_NodosSeleccionados.Text = "Nodos Seleccionados:\n\t\t" + "{" + NodoCamino1 + " , " + NodoCamino2 + "}";
                        TipoOperacion = -1;
                        break;
                    }
                }
                break;
            }
        }
예제 #3
0
        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);
        }