public Dijkstra(IGraph g, INode src, IComparer <AuxNode <double, int> > comp) { compare = comp.Compare; List <AuxNode <double, int> > auxNodes = new List <AuxNode <double, int> >(); nodes = new List <INode>(g.AllNodes.Values); var pq = new PriorityQueue <AuxNode <double, int> >(nodes.Count, comp.Compare); dict = Dictionarize(nodes); dist = new double[nodes.Count]; prev = new int[nodes.Count]; for (int i = 0; i != nodes.Count; ++i) { if (src != nodes[i]) { dist[i] = Double.PositiveInfinity; } else { dist[i] = 0; } prev[i] = int.MinValue; var auxNode = new AuxNode <double, int>(dist[i], i); auxNodes.Add(auxNode); pq.Enqueue(auxNode); } while (pq.Count != 0) { var auxNode = pq.Dequeue(); var edges = nodes[auxNode.Item].ConnectOut; foreach (Edge edge in edges) { var idxFrom = dict[edge.From]; var idxTo = dict[edge.To]; var newDist = dist[idxFrom] + (double)edge["Weight"]; if (newDist < dist[idxTo]) { dist[idxTo] = newDist; prev[idxTo] = idxFrom; var newKey = new AuxNode <double, int>(newDist, idxTo); pq.DecreaseKey(auxNodes[idxTo], newKey); auxNodes[idxTo] = newKey; } } } }
int IComparable <AuxNode <TKey, TItem> > .CompareTo(AuxNode <TKey, TItem> other) { return(Weight.CompareTo(other.Weight)); }