Example #1
0
        public DijkstraDistance[] getShortestPathsFrom(int source)
        {
            var vertexes = new List <DijkstraDistance> ();

            DijkstraDistance[] distances = new DijkstraDistance[mVerticies.Count];
            distances[source] = new DijkstraDistance(source, 0);

            for (int i = 0; i < distances.Length; i++)
            {
                if (i != source)
                {
                    distances[i] = new DijkstraDistance(i, Int32.MaxValue);
                }
                vertexes.Add(distances[i]);
            }

            while (vertexes.Count > 0)
            {
                vertexes.Sort();
                DijkstraDistance smallest = vertexes [0];

                vertexes.Remove(smallest);

                WeightedNode n = (WeightedNode)mVerticies [smallest.mVertex];

                double dist;

                foreach (WeightedEdge e in n.getNeighbors())
                {
                    if (n == e.getFirst())
                    {
                        dist = distances [n.getIndex()].mCurrentDistance + e.getWeight();

                        if (dist < distances [e.getSecond().getIndex()].mCurrentDistance)
                        {
                            distances [e.getSecond().getIndex()].mCurrentDistance = dist;
                        }
                    }
                    else
                    {
                        dist = distances [n.getIndex()].mCurrentDistance + e.getWeight();

                        if (dist < distances [e.getFirst().getIndex()].mCurrentDistance)
                        {
                            distances [e.getFirst().getIndex()].mCurrentDistance = dist;
                        }
                    }
                }
            }

            return(distances);
        }
Example #2
0
            public int CompareTo(object obj)
            {
                DijkstraDistance x = (DijkstraDistance)obj;

                if (mCurrentDistance > x.mCurrentDistance)
                {
                    return(1);
                }
                if (mCurrentDistance < x.mCurrentDistance)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            }
Example #3
0
            public int Compare(object a, object b)
            {
                DijkstraDistance x = (DijkstraDistance)a;
                DijkstraDistance y = (DijkstraDistance)b;

                if (x.mCurrentDistance > y.mCurrentDistance)
                {
                    return(1);
                }
                if (x.mCurrentDistance < y.mCurrentDistance)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            }
Example #4
0
        public List <DijkstraDistance> GetShortestDistancesFrom(Vector2Int source)
        {
            SimplePriorityQueue <DijkstraDistance> vertexQueue = new SimplePriorityQueue <DijkstraDistance>();
            DijkstraDistance start = new DijkstraDistance(source, 0);

            start.Path.Add(source);
            List <DijkstraDistance> distances = new List <DijkstraDistance>()
            {
                start
            };

            foreach (var vertex in mVertices)
            {
                DijkstraDistance dijkstraDistance = new DijkstraDistance(vertex.mVertex, Int32.MaxValue);
                if (vertex.mVertex != source)
                {
                    distances.Add(dijkstraDistance);
                }
                vertexQueue.Enqueue(dijkstraDistance, (float)dijkstraDistance.CurrentDistance);
            }

            while (vertexQueue.Count > 0)
            {
                var uDistance = vertexQueue.Dequeue();

                var uVertex = mVertices.SingleOrDefault(v => v.mVertex == uDistance.Vertex);

                foreach (var edge in uVertex.mNeighbors)
                {
                    WeightedNode vVertex;
                    if (edge.mFirst == uVertex)
                    {
                        vVertex = edge.mSecond;
                    }
                    else
                    {
                        vVertex = edge.mFirst;
                    }

                    if (!vVertex.Equals(uVertex))
                    {
                        if (vertexQueue.Contains(distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex)))
                        {
                            double length = distances.SingleOrDefault(d => d.Vertex == uVertex.mVertex).CurrentDistance + edge.weight;
                            if (length == Int32.MaxValue)
                            {
                                Debug.Log("");
                            }
                            if (length < distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex).CurrentDistance)
                            {
                                vertexQueue.Remove(distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex));
                                distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex).CurrentDistance = length;
                                distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex).Path.Clear();
                                distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex).Path.AddRange(uDistance.Path);
                                distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex).Path.Add(vVertex.mVertex);
                                vertexQueue.Enqueue(distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex), (float)distances.SingleOrDefault(d => d.Vertex == vVertex.mVertex).CurrentDistance);
                            }
                        }
                    }
                }
            }
            return(distances);
        }