Пример #1
0
        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;
                    }
                }
            }
        }
Пример #2
0
 int IComparable <AuxNode <TKey, TItem> > .CompareTo(AuxNode <TKey, TItem> other)
 {
     return(Weight.CompareTo(other.Weight));
 }