Beispiel #1
0
        public void Add(Arista element)
        {
            array.Add(element);
            int c = array.Count - 1;

            while (c > 0 && array[c].peso.CompareTo(array[c / 2].peso) == -1)
            {
                Arista tmp = array[c];
                array[c]     = array[c / 2];
                array[c / 2] = tmp;
                c            = c / 2;
            }
        }
Beispiel #2
0
        public Arista RemoveMin()
        {
            Arista ret = array[0];

            array[0] = array[array.Count - 1];
            array.RemoveAt(array.Count - 1);

            int c = 0;

            while (c < array.Count)
            {
                int min = c;
                if (2 * c + 1 < array.Count && array[2 * c + 1].peso.CompareTo(array[min].peso) == -1)
                {
                    min = 2 * c + 1;
                }
                if (2 * c + 2 < array.Count && array[2 * c + 2].peso.CompareTo(array[min].peso) == -1)
                {
                    min = 2 * c + 2;
                }

                if (min == c)
                {
                    break;
                }
                else
                {
                    Arista tmp = array[c];
                    array[c]   = array[min];
                    array[min] = tmp;
                    c          = min;
                }
            }

            return(ret);
        }
Beispiel #3
0
 public void Add(Arista element)
 {
     minHeap.Add(element);
 }
Beispiel #4
0
        public void Dijkstra(int pNodoOrigen, int pNodoDestino)
        {
            if (nodoDestino == -1 || nodoOrigen == -1)
            {
                return;
            }

            Path = new List <int>();

            List <int> ComollegoA = new List <int>();

            MinHeap ColaPendiente = new MinHeap();


            List <double> Distancias = new List <double>();

            for (int i = 0; i < myGrafo.Count; i++)
            {
                ComollegoA.Add(-1);
            }

            for (int i = 0; i < myGrafo.Count; i++)
            {
                Distancias.Add(INFINITO);
            }

            Distancias[pNodoOrigen] = 0;
            Arista a = new Arista(); a.indexDestino = pNodoDestino; /*a.indexOrigen = nodoOrigen;*/ a.peso = Distancias[pNodoOrigen];

            ColaPendiente.Add(new Arista {
                peso = Distancias[pNodoOrigen], indexDestino = pNodoDestino
            });                                                                                       //Mete el primero el cual se le asigna una distancia 0

            while (ColaPendiente.Count > 0)
            {
                Arista tempNodo = ColaPendiente.RemoveMin();
                //POP();

                if (pNodoDestino == tempNodo.indexDestino)
                {
                    break;                                        //si es que nodo temp que estoy recorriendo llega a ser igual que el nodo destino significa que lo encontro(minimamente)
                }
                for (int i = 0; i < myGrafo[tempNodo.indexDestino].Count; i++)
                {
                    Arista auxNodo = paraderos[tempNodo.indexDestino].conexiones[i];
                    //PARTTE DEL RELAX - auxNodo.first ES EL PEDACITO
                    if ((Distancias[tempNodo.indexDestino] + auxNodo.peso) < Distancias[auxNodo.indexDestino])
                    {
                        Distancias[auxNodo.indexDestino] = Distancias[tempNodo.indexDestino] + auxNodo.peso;
                        ColaPendiente.Add(new Arista {
                            peso = Distancias[auxNodo.indexDestino], indexDestino = auxNodo.indexDestino
                        });                                                        //LO AGREGO A LA COLITA DE PEND (NO SE QUEDARA VACIO)
                        ComollegoA[auxNodo.indexDestino] = tempNodo.indexDestino;  //el tempNodo es el que reviso todos sus aristas tonce por ese medio llefo a aUxNODO
                    }
                }
            }

            double     DistanciaFinal = Distancias[pNodoDestino];
            List <int> Pasos          = new List <int>();

            Pasos.Add(pNodoDestino);
            while (ComollegoA[pNodoDestino] != -1) //paso del vector de como llego a a un veector de pasos y lo revierto para tener el camino
            {
                Pasos.Add(ComollegoA[pNodoDestino]);
                pNodoDestino = ComollegoA[pNodoDestino];
            }

            Pasos.Reverse();
            //reverse(Pasos.begin(),Pasos.end());
            //Tuple<List<int>, int> par = new Tuple<List<int>, int>(Pasos,DistanciaFinal);

            //return par;
            Path = Pasos;
        }