public void KruskalMST(Grafo g) { Grafo Aux = new Grafo(); List <Arco> Arcos = new List <Arco>(); List <Arco> RelacionesArbolKruskal = new List <Arco>(); foreach (Nodo n in g.Nodos) { foreach (Arco r in n.Relaciones) { Arcos.Add(r); } } Arcos = Arcos.OrderBy(x => x.Peso).ToList(); string CadAux = "Relaciones Ordenadas por el peso\n"; for (int i = 0; i < g.Nodos.Count; i++) { bool Ciclo = false; Arco RelacionMenor = BuscaRelacionMenorKruskal(Arcos); for (int j = 0; j < Aux.Nodos.Count; j++) { if (GrafoContieneCiclo(j, j, Aux.GeneraMatrizAdyacencia(), Aux.Nodos.Count)) { Ciclo = true; break; } } if (!Ciclo) { if (!ConfirmaExistenciaNodosEnKruskal(Aux, RelacionMenor.Origen)) { Nodo Nuevo = new Nodo(); Nuevo.Identificador = RelacionMenor.Origen; Aux.AgregarNodo(Nuevo); } else if (!ConfirmaExistenciaNodosEnKruskal(Aux, RelacionMenor.Destino)) { Nodo Nuevo = new Nodo(); Nuevo.Identificador = RelacionMenor.Destino; Aux.AgregarNodo(Nuevo); } int IndiceNodoCrearRelacion = ObtenIndiceNodo(Aux, RelacionMenor.Origen); int IndiceNodoRelacionDestino = ObtenIndiceNodo(Aux, RelacionMenor.Destino); if (IndiceNodoCrearRelacion != -1) { if (Aux.Nodos[IndiceNodoCrearRelacion].TieneRelacion(0)) { } Aux.Nodos[IndiceNodoCrearRelacion].AñadirRelacion(RelacionMenor.Destino, RelacionMenor.Peso); } } } /*foreach(Arco a in Arcos) * { * CadAux += "Origen: " + a.Origen + " , Destino: " + a.Destino + " , Peso: " + a.Peso + "\n"; * }*/ MessageBox.Show(CadAux); }
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; } }