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; } }
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); }
public void Add(Arista element) { minHeap.Add(element); }
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; }