public Dictionary <int, DistanceInfo> BuildDistanceTable(GraphDS graph, int source)
        {
            Dictionary <int, DistanceInfo> distanceMap = new Dictionary <int, DistanceInfo>();
            Queue <int> queue = new Queue <int>();

            queue.Enqueue(source);
            for (int i = 0; i < graph.Numvertices; i++)
            {
                distanceMap.Add(i, new DistanceInfo());
            }
            distanceMap[0].SetDisance(0);
            distanceMap[0].SetLastVertex(source);
            while (queue.Count > 0)
            {
                var vertex       = queue.Dequeue();
                var adjacentList = graph.GetAdjacentVertices(vertex);
                var distanceInfo = distanceMap[vertex];
                foreach (var adjacent in adjacentList)
                {
                    var currentDistance = distanceMap[adjacent].GetDistance();
                    if (currentDistance == -1)
                    {
                        distanceMap[adjacent].SetDisance(distanceInfo.GetDistance() + 1);
                        distanceMap[adjacent].SetDisance(distanceInfo.GetLastVertex());
                        if (graph.GetAdjacentVertices(adjacent).Count > 0)
                        {
                            queue.Enqueue(vertex);
                        }
                    }
                }
            }
            return(distanceMap);
        }
        public List <int> ShortestPath(GraphDS graph, int source, int destination)
        {
            Dictionary <int, DistanceInfo> distanceMap = BuildDistanceTable(graph, source);
            Stack <int> shortestPathStack = new Stack <int>();

            shortestPathStack.Push(destination);
            var lastVertex = distanceMap[destination].GetLastVertex();

            while (lastVertex != -1 && lastVertex != source)
            {
                shortestPathStack.Push(lastVertex);
                lastVertex = distanceMap[lastVertex].GetLastVertex();
            }
            if (lastVertex == -1)
            {
                return(null);
            }
            return(shortestPathStack.ToList());
        }