Exemplo n.º 1
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;
        }