public static List <SortedSetNode> ExtractSolution(SortedSetNode[] results)
        {
            List <SortedSetNode> Route = new List <SortedSetNode>();


            SortedSetNode         CurrentNode   = results[DestinationID]; // the virtual end h7otha fl currentt to dsply
            Stack <SortedSetNode> ReversedRoute = new Stack <SortedSetNode>();

            ReversedRoute.Push(CurrentNode);

            while (CurrentNode.Parent != null)
            {
                CurrentNode = results[CurrentNode.Parent.ID];     // basawy nfsy bl ably
                ReversedRoute.Push(CurrentNode);
            }

            while (ReversedRoute.Count > 0)     // bamshy 3l stack
            {
                Route.Add(ReversedRoute.Pop());
            }

            return(Route);
        }
        public static SortedSetNode[] Dijkstra(Node CurrentNode)                    // 3 thngs nedded
        {
            SortedSetNode[]           results    = new SortedSetNode[Nodes.Count];  //1.array of obj from class ssn
            SortedSet <SortedSetNode> NextLowest = new SortedSet <SortedSetNode>(); // forimg ssn frm class

            bool[] visited = new bool[Nodes.Count];


            NextLowest.Add(new SortedSetNode(CurrentNode.ID, 0, 0, null));

            results[CurrentNode.ID] = new SortedSetNode(CurrentNode.ID, 0, 0, null);     //id,c,d,p

            int NumberOfNodes = Nodes.Count;

            while (NumberOfNodes != 0)                      /////////////////////////////////////////////
            {
                CurrentNode = Nodes[NextLowest.First().ID]; // hshof el 3ndo  asghr w aro7 l node-o
                NumberOfNodes--;

                if (CurrentNode.ID == DestinationID)
                {
                    return(results);
                }


                NextLowest.Remove(NextLowest.First());
                visited[CurrentNode.ID] = true;     // hashel l node mn l visited dic

                int EdgeCount = Edges[CurrentNode.ID].Count;

                for (int i = 0; i < EdgeCount; i++)           // looping on all neighbours
                {
                    if (!visited[Edges[CurrentNode.ID][i].NeighbourID])
                    {
                        double CurrentNodeTime     = results[CurrentNode.ID].weight;                                 // node 2 time
                        double CurrentNodeDistance = results[CurrentNode.ID].distance;

                        int NeighbourID = Edges[CurrentNode.ID][i].NeighbourID;

                        double NeighbourEdgeTime     = Edges[CurrentNode.ID][i].time;                // edge between
                        double NeighbourEdgeDistance = Edges[CurrentNode.ID][i].distance;

                        double NeighbourNodeTime;

                        if (results[NeighbourID] == null)
                        {
                            NeighbourNodeTime = Int32.MaxValue;
                        }
                        else
                        {
                            NeighbourNodeTime = results[NeighbourID].weight;
                        }

                        if (NeighbourEdgeTime + CurrentNodeTime < NeighbourNodeTime)
                        {
                            SortedSetNode NewNode = new SortedSetNode(NeighbourID, NeighbourEdgeTime + CurrentNodeTime, NeighbourEdgeDistance + CurrentNodeDistance, Nodes[CurrentNode.ID]);      // updating the shortest path results for node 3
                            SortedSetNode OldNode = results[NeighbourID];
                            results[NeighbourID] = NewNode;

                            NextLowest.Remove(OldNode);
                            NextLowest.Add(NewNode);
                        }
                    }
                }
            }

            return(results);
        }