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); }
public int CompareTo(object obj) { DijkstraDistance x = (DijkstraDistance)obj; if (mCurrentDistance > x.mCurrentDistance) { return(1); } if (mCurrentDistance < x.mCurrentDistance) { return(-1); } else { return(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); } }
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); }