public void DFS(Stack <Vertice> Pila, List <Vertice> Visitados, List <Vertice> Camino) { Vertice v_act = Pila.Pop(); foreach (Arista a in v_act.getLa()) { bool Band = false; foreach (Vertice v in Visitados) { if (v.getId() == a.getVertex().getId()) { Band = true; break; } } if (Band == false) { if (ArmPrim == true) { foreach (Vertice Ref in ArbolPrim.getLv()) { if (a.getVertex().getId() == Ref.getId()) { Visitados.Add(a.getVertex()); Pila.Push(Ref); Camino.Add(a.getVertex()); DFS(Pila, Visitados, Camino); Camino.Add(a.getVertexOrigen()); } } } if (ArmKruskal == true) { foreach (Vertice Ref in ArbolKruskal.getLv()) { if (a.getVertex().getId() == Ref.getId()) { Visitados.Add(a.getVertex()); Pila.Push(Ref); Camino.Add(a.getVertex()); DFS(Pila, Visitados, Camino); Camino.Add(a.getVertexOrigen()); } } } } } }
private void BtnKruskal_Click(object sender, EventArgs e) { ArmKruskal = true; ArmPrim = false; pictureBox1.BackgroundImage = ARM; pictureBox1.BackgroundImageLayout = ImageLayout.Zoom; List <Vertice> Visitados = new List <Vertice>(); Stack <Vertice> Pila = new Stack <Vertice>(); CaminoKruskal = new List <Vertice>(); int Buscado = comboBox1.SelectedIndex + 1; foreach (Vertice v in ArbolKruskal.getLv()) { if (Buscado == v.getId()) { Pila.Push(v); Visitados.Add(v); CaminoKruskal.Add(v); break; } } DFS(Pila, Visitados, CaminoKruskal); while (Visitados.Count != ArbolKruskal.getLv().Count) { foreach (Vertice v in ArbolKruskal.getLv()) { bool Band = false; foreach (Vertice Bus in Visitados) { if (v.getId() == Bus.getId()) { Band = true; break; } } if (Band == false) { Visitados.Add(v); Pila.Push(v); CaminoKruskal.Add(v); DFS(Pila, Visitados, CaminoKruskal); } } } Graphics graphics = Graphics.FromImage(copia); LimpiarBitmap(copia, Color.Transparent); pictureBox1.Image = copia; BrochaAgente = new SolidBrush(Color.Red); List <Point> Linea = new List <Point>(); Point punto = new Point(); int b, c; listBox1.Items.Clear(); LlenalistBox(); listBox1.Update(); Agente agente = new Agente(CaminoKruskal[0], 1, CaminoKruskal); bool Vuelta = false; while (true) { b = agente.GetcontAristas(); bool Encontrado = false; foreach (Arista a in agente.getCamino()[b].getLa()) { if (b < CaminoKruskal.Count) { if (a.getVertex() == agente.getCamino()[b + 1] && b == 0) { bool Reversa = true; foreach (Arista rev in AristasKruskal) { if (Buscado == rev.getVertexOrigen().getId()) { Reversa = false; Linea = a.getLinea(); break; } } if (Reversa == true && Vuelta == false) { Linea = a.getLinea(); Linea.Reverse(); Vuelta = true; } Encontrado = true; } if (a.getVertex() == agente.getCamino()[b + 1] && b != 0) { if (b + 2 == CaminoKruskal.Count && Vuelta == true) { Linea = a.getLinea(); Linea.Reverse(); Vuelta = false; } else { Linea = a.getLinea(); } Encontrado = true; } } } if (Encontrado == false) { agente.SetcontPunto(Linea.Count - 5); } c = agente.GetcontPuntos(); if (Linea.Count - 5 <= c) { c = Linea.Count - 1; } punto = Linea[c]; pictureBox1.Refresh(); LimpiarBitmap(copia, Color.Transparent); DibujarCirculo(punto, BrochaAgente, copia); DibujarId(punto, drawBrush, copia, agente.getId()); agente.SetcontPunto(agente.GetcontPuntos() + 7); if (agente.GetcontPuntos() >= Linea.Count) { agente.SetcontPunto(0); agente.SetcontAristas(agente.GetcontAristas() + 1); } if (agente.GetcontAristas() + 1 == CaminoKruskal.Count) { DibujarCirculo(punto, BrochaAgente, copia); break; } } pictureBox1.Refresh(); }