예제 #1
0
        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);
        }
예제 #2
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;
            }
        }