public void CaminoEuler(Grafo g, int idOrigen, int idDestino, List <List <int> > Camino) { List <int> ListaAuxInt = new List <int>(); Nodo origen = g.Nodos[idOrigen - 1]; Nodo destino = g.Nodos[idDestino - 1]; foreach (Nodo n in g.Nodos) { ListaAuxInt.Add(n.ObtenGradoNodo()); } int Pares = 0, Impares = 0; for (int i = 0; i < ListaAuxInt.Count; i++) { if (ListaAuxInt[i] % 2 == 0) { Pares++; } else { Impares++; } } if (Pares == ListaAuxInt.Count - 2 && Impares == 2) { if (origen.ObtenGradoNodo() % 2 != 0 && destino.ObtenGradoNodo() % 2 != 0) { List <Nodo> ListaAux1, ListaAux2; ListaAux1 = new List <Nodo>(); ListaAux2 = new List <Nodo>(); ListaAux1.Add(origen); for (int i = 0; i < origen.ObtenGradoNodo(); i++) { ListaAux2.Add(BuscaNodoInt(g.Nodos, origen.ObtenRelacion(i).Destino)); ListaAux1.Add(BuscaNodoInt(g.Nodos, origen.ObtenRelacion(i).Destino)); EulerAlgoritmoRec(ListaAux1, ListaAux2, g, Camino); ListaAux1.RemoveAt(ListaAux1.Count - 1); ListaAux2.RemoveAt(ListaAux2.Count - 1); } } else { MessageBox.Show("Seleccione los nodos de grado impar"); } } else { MessageBox.Show("No cumple los requisitos"); } origen = null; destino = null; }
public void FleuryAlgoritmoRec(List <Nodo> ListaAux1, List <Nodo> ListaAux2, Grafo g, List <List <int> > circuito) { Nodo nd = ListaAux1[ListaAux1.Count - 1]; Boolean usado = false; if (ListaAux2.Count < g.ObtenNumeroRelaciones() / 2) { for (int i = 0; i < nd.ObtenGradoNodo(); i++) { Nodo aux = BuscaNodoInt(g.Nodos, nd.ObtenRelacion(i).Destino); for (int j = 0; j < ListaAux2.Count; j++) { if ((ListaAux1[j].Equals(aux) && ListaAux2[j].Equals(nd)) || (ListaAux1[j].Equals(nd) && ListaAux2[j].Equals(aux))) { usado = true; break; } } if (!usado) { ListaAux2.Add(aux); ListaAux1.Add(aux); FleuryAlgoritmoRec(ListaAux1, ListaAux2, g, circuito); ListaAux1.RemoveAt(ListaAux1.Count - 1); ListaAux2.RemoveAt(ListaAux2.Count - 1); } else { usado = false; } } } else { List <Nodo> serie = new List <Nodo>(); for (int i = 0; i < ListaAux1.Count; i++) { serie.Add(ListaAux1[i]); } List <int> Aux = new List <int>(); for (int i = 0; i < ListaAux1.Count; i++) { Aux.Add(ListaAux1[i].Identificador); } circuito.Add(Aux); } }
public void EulerAlgoritmoRec(List <Nodo> ListaAux1, List <Nodo> ListaAux2, Grafo grafo, List <List <int> > camino) { Nodo n = ListaAux1[ListaAux1.Count - 1]; Boolean Utilizado = false; if (ListaAux2.Count < grafo.ObtenNumeroRelaciones() / 2) { for (int i = 0; i < n.ObtenGradoNodo(); i++) { Nodo aux = BuscaNodoInt(grafo.Nodos, n.ObtenRelacion(i).Destino); for (int j = 0; j < ListaAux2.Count; j++) { if ((ListaAux1[j].Equals(aux) && ListaAux2[j].Equals(n)) || (ListaAux1[j].Equals(n) && ListaAux2[j].Equals(aux))) { Utilizado = true; break; } } if (!Utilizado) { ListaAux2.Add(aux); ListaAux1.Add(aux); EulerAlgoritmoRec(ListaAux1, ListaAux2, grafo, camino); ListaAux1.RemoveAt(ListaAux1.Count - 1); ListaAux2.RemoveAt(ListaAux2.Count - 1); } else { Utilizado = false; } } } else { List <Nodo> serie = new List <Nodo>(); for (int i = 0; i < ListaAux1.Count; i++) { serie.Add(ListaAux1[i]); } List <int> Aux = new List <int>(); for (int i = 0; i < ListaAux1.Count; i++) { Aux.Add(ListaAux1[i].Identificador); } camino.Add(Aux); } }
public void CircuitoEuler(Grafo g, int idNodo, List <List <int> > circuito) { Boolean requisitos = true; List <int> arr = new List <int>(); Nodo origen = BuscaNodoInt(g.Nodos, idNodo); foreach (Nodo n in g.Nodos) { arr.Add(n.ObtenGradoNodo()); } for (int i = 0; i < arr.Count; i++) { if (arr[i] % 2 != 0) { requisitos = false; } } if (requisitos) { List <Nodo> ListaAux1, ListaAux2; ListaAux1 = new List <Nodo>(); ListaAux2 = new List <Nodo>(); ListaAux1.Add(origen); for (int i = 0; i < origen.ObtenGradoNodo(); i++) { ListaAux2.Add(BuscaNodoInt(g.Nodos, origen.ObtenRelacion(i).Destino)); ListaAux1.Add(BuscaNodoInt(g.Nodos, origen.ObtenRelacion(i).Destino)); FleuryAlgoritmoRec(ListaAux1, ListaAux2, g, circuito); ListaAux1.RemoveAt(ListaAux1.Count - 1); ListaAux2.RemoveAt(ListaAux2.Count - 1); } } else { MessageBox.Show("Desafortunadamente no todos los nodos tienen grado par"); } origen = null; }
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; } }