public CArco(CVertice destino, int peso) { this.nDestino = destino; this.peso = peso; this.grosor_flecha = 2; this.color = Color.Red; }
public CLista(CLista pLista) { if (pLista != null) { aElemento = pLista.aElemento; aSubLista = pLista.aSubLista; aPeso = pLista.aPeso; } }
// Crea la arista a partir de los nodos de origen y de destino public bool AgregarArco(CVertice origen, CVertice nDestino, int peso = 1) { if (origen.ListaAdyacencia.Find(v => v.nDestino == nDestino) == null) { origen.ListaAdyacencia.Add(new CArco(nDestino, peso)); return true; } return false; }
private Vertice ventanaVertice; // ventana para agregar los vértices #endregion Fields #region Constructors public Simulador() { InitializeComponent(); this.StyleManager = SimuladorStyleManager; grafo = new CGrafo(); nuevoNodo = null; var_control = 0; ventanaVertice = new Vertice(); ventanaArco = new Arco(); ventanaBuscarNodo = new BuscarNodo(); this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); }
private void Pizarra_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) // Si se ha presionado el botón // izquierdo del mouse { if ((NodoOrigen = grafo.DetectarPunto(e.Location)) != null) { var_control = 1; // recordemos que es usado para indicar el estado en la pizarra: // 0 -> sin accion, 1 -> Dibujando arco, 2 -> Nuevo vértice } if (nuevoNodo != null && NodoOrigen == null) { ventanaVertice.Visible = false; ventanaVertice.control = false; grafo.AgregarVertice(nuevoNodo); ventanaVertice.ShowDialog(); if (ventanaVertice.control) { if (grafo.BuscarVertice(ventanaVertice.txtVertice.Text) == null) { nuevoNodo.Valor = ventanaVertice.txtVertice.Text; } else { MetroMessageBox.Show(this, "El Nodo " + ventanaVertice.txtVertice.Text + " ya existe en el grafo ", "Error nuevo Nodo ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); grafo.EliminarVertice(nuevoNodo); } } nuevoNodo = null; var_control = 0; Pizarra.Refresh(); } } if (e.Button == System.Windows.Forms.MouseButtons.Right) // Si se ha presionado el botón // derecho del mouse { if (var_control == 0) { if ((NodoOrigen = grafo.DetectarPunto(e.Location)) != null) { CMSCrearVertice.Text = "Nodo " + NodoOrigen.Valor; } else Pizarra.ContextMenuStrip = this.CMSCrearVertice; } } }
public void Agregar(CVertice pElemento, int pPeso) { if (pElemento != null) { if (aElemento == null) { aElemento = new CVertice(pElemento.Valor); aPeso = pPeso; aSubLista = new CLista(); } else { if (!ExisteElemento(pElemento)) aSubLista.Agregar(pElemento, pPeso); } } }
public CLista(CVertice pElemento, CLista pSubLista, int pPeso) { aElemento = pElemento; aSubLista = pSubLista; aPeso = pPeso; }
private void cargarNodosToolStripMenuItem_Click(object sender, EventArgs e) { VentanaCargar.InitialDirectory = "c:\\"; //Directorio inicial para el LoadDialog VentanaCargar.Filter = "txt Files (*.TXT)|*.TXT"; //Filtro de archivos VentanaCargar.FilterIndex = 2; //Indice del filtro VentanaCargar.RestoreDirectory = true; //Volver a abrir donde se cerro DialogResult result = VentanaCargar.ShowDialog(); //Mostrar la ventana para cargar if (result == DialogResult.OK) // Si fue satisfactorio { string file; file = VentanaCargar.FileName; //Guardamos la direccion del archivo StreamReader SR = new StreamReader(@file); string line; while ((line = SR.ReadLine()) != null) { foreach (string nodos in line.Split(',')) { if (var_control == 4) break; foreach (string puntos in nodos.Split('-')) { if (puntos.Contains(':')) { nuevoNodo = new CVertice(nodos.Split('-')[0]); Point xy = new Point(int.Parse(puntos.Split(':')[0]), int.Parse(puntos.Split(':')[1])); nuevoNodo.Posicion = xy; if (grafo.BuscarVertice(nuevoNodo.Valor) == null) grafo.AgregarVertice(nuevoNodo); else { var_control = 4; break; } nuevoNodo = null; } } } } if (var_control == 4) { grafo.EliminarTodo(); MetroMessageBox.Show(this, "Error no se agrego ningun nodo por que se encontro repetido por lo menos 1", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } SR.Close(); Pizarra.Refresh(); } }
// Constructores public CLista() { aElemento = null; aSubLista = null; aPeso = 0; }
public int PosicionElemento(CVertice pElemento) { if ((aElemento != null) || (ExisteElemento(pElemento))) if (aElemento.Equals(pElemento)) return 1; else return 1 + aSubLista.PosicionElemento(pElemento); else return 0; }
public bool ExisteElemento(CVertice pElemento) { if ((aElemento != null) && (pElemento != null)) { return (aElemento.Equals(pElemento) || (aSubLista.ExisteElemento(pElemento))); } else return false; }
private void RecorridoAnchura(CVertice nodo) { CVertice temp = new CVertice(); nodo.Visitado = true; Queue<CVertice> cola = new Queue<CVertice>(); cola.Enqueue(nodo); grafo.Colorear(nodo); Pizarra.Refresh(); Thread.Sleep(tiempo); while (cola.Count != 0) { temp = cola.Dequeue(); foreach (CArco arco in temp.ListaAdyacencia) { if (arco.nDestino.Visitado == false) { cola.Enqueue(arco.nDestino); } } foreach (CArco arco in temp.ListaAdyacencia) { if (arco.nDestino.Visitado == false) { arco.nDestino.Visitado = true; grafo.Colorear(arco.nDestino); Pizarra.Refresh(); Thread.Sleep(tiempo); } } } }
//Metodo para resaltar nodos del grafo public void Colorear(CVertice nodo) { nodo.Color = Color.AliceBlue; nodo.FontColor = Color.Black; }
private void nuevoVerticeToolStripMenuItem_Click(object sender, EventArgs e) { nuevoNodo = new CVertice(); var_control = 2; // recordemos que es usado para indicar el estado en la pizarra: 0 -> // sin accion, 1 -> Dibujando arco, 2 -> Nuevo vértice }
//=====================Operaciones Básicas================================= //Construye un nodo a partir de su valor y lo agrega a la lista de nodos public CVertice AgregarVertice(string valor) { CVertice nodo = new CVertice(valor); nodos.Add(nodo); return nodo; }
//Elimina un nodo de la lista de nodos del grafo public void EliminarVertice(CVertice nodo) { nodos.Remove(nodo); }
private void cargarAristasToolStripMenuItem_Click(object sender, EventArgs e) { VentanaCargar.InitialDirectory = "c:\\"; //Directorio inicial para el LoadDialog VentanaCargar.Filter = "txt Files (*.TXT)|*.TXT"; //Filtro de archivos VentanaCargar.FilterIndex = 2; //Indice del filtro VentanaCargar.RestoreDirectory = true; //Volver a abrir donde se cerro DialogResult result = VentanaCargar.ShowDialog(); //Mostrar la ventana para cargar if (result == DialogResult.OK) // Si fue satisfactorio { string file; file = VentanaCargar.FileName; //Guardamos la direccion del archivo StreamReader SR = new StreamReader(@file); string line; while ((line = SR.ReadLine()) != null) { foreach (string arcos in line.Split(',')) { foreach (string nodos in arcos.Split(':')) { if (nodos.Contains('-')) { NodoOrigen = grafo.BuscarVertice(nodos.Split('-')[0]); NodoDestino = grafo.BuscarVertice(nodos.Split('-')[1]); } else { int peso; int.TryParse(nodos, out peso); if (NodoOrigen != null && NodoDestino != null && peso > 0) grafo.AgregarArco(NodoOrigen, NodoDestino, peso); NodoOrigen = null; NodoDestino = null; } } } } SR.Close(); Pizarra.Refresh(); } }
private void RecorridoProfundidad(CVertice nodo) { CVertice temp = new CVertice(); Stack<CVertice> pila = new Stack<CVertice>(); pila.Push(nodo); while (pila.Count != 0) { temp = pila.Pop(); if (temp.Visitado == false) { temp.Visitado = true; grafo.Colorear(temp); Pizarra.Refresh(); Thread.Sleep(tiempo); foreach (CArco arco in temp.ListaAdyacencia) { pila.Push(arco.nDestino); } } } }
// Métodos public CArco(CVertice destino) : this(destino, 1) { this.nDestino = destino; }
public void Eliminar(CVertice pElemento) { if (aElemento != null) { if (aElemento.Equals(pElemento)) { aElemento = aSubLista.aElemento; aSubLista = aSubLista.SubLista; } else aSubLista.Eliminar(pElemento); } }
//Agrega un nodo a la lista de nodos del grafo public void AgregarVertice(CVertice nuevonodo) { nodos.Add(nuevonodo); }
private void Pizarra_MouseUp(object sender, MouseEventArgs e) { switch (var_control) { case 1: // Dibujando arco ventanaArco.Visible = false; ventanaArco.control = false; if ((NodoDestino = grafo.DetectarPunto(e.Location)) != null && NodoOrigen != NodoDestino) { ventanaArco.ShowDialog(); if (ventanaArco.control) { int distancia = int.Parse(ventanaArco.txtArco.Text); grafo.AgregarArco(NodoOrigen, NodoDestino, distancia); } } var_control = 0; NodoOrigen = null; NodoDestino = null; Pizarra.Refresh(); break; } }