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); }
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; } }
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); }