C# 在广度优先搜索中使用堆栈查找最短路径

C# 在广度优先搜索中使用堆栈查找最短路径,c#,algorithm,graph,shortest-path,breadth-first-search,C#,Algorithm,Graph,Shortest Path,Breadth First Search,我很难为我的图实现最短路径算法。这个封面上有很多文章都是使用哪种算法的,但都没有这个基础。我想我已经实现了遍历的每个节点,我存储了一个数组,指示我来自哪里。我不知道如何通过堆栈找到最短路径 我有以下节点: 我的顶点列表是: 东京、夏威夷、旧金山、洛杉矶、圣地亚哥、芝加哥、纽约、迈阿密、伦敦 在寻找从伦敦到夏威夷的路径时,我的堆栈最终看起来像: 000000000 000400000 101100000 033033000 02002000 005500550 000007707 0000060

我很难为我的图实现最短路径算法。这个封面上有很多文章都是使用哪种算法的,但都没有这个基础。我想我已经实现了遍历的每个节点,我存储了一个数组,指示我来自哪里。我不知道如何通过堆栈找到最短路径

我有以下节点:

我的顶点列表是:

东京、夏威夷、旧金山、洛杉矶、圣地亚哥、芝加哥、纽约、迈阿密、伦敦

在寻找从伦敦到夏威夷的路径时,我的堆栈最终看起来像:
000000000
000400000
101100000
033033000
02002000
005500550
000007707
000006066
000000880

不知何故,东京与圣地亚哥联系在一起,但其余的(我认为)看起来是正确的。下面是我的实现,但我不知道如何运行堆栈并追溯我的方法。下面的代码输出路径:夏威夷、夏威夷、夏威夷。这是错误的

 public static List<string> ShortestPath(Graph graph, string src, string dest)
    {
        List<string> path = new List<string>();

        List<string> city_ref = graph.GetVertices();
        Queue<string> Visited = new Queue<string>();
        Queue<string> ToVisit = new Queue<string>();
        Stack<int[]> stack = new Stack<int[]>();

        ToVisit.Enqueue(src);
        while (ToVisit.Count != 0)
        {
            string V = ToVisit.Dequeue();
            if (Visited.Contains(V))
                ;
            else
            {
                int[] previous = new int[city_ref.Count];
                for (int i = 0; i < graph.Neighbors(V).Count; i++)
                {
                    //previous[i] = -1;
                    ToVisit.Enqueue(graph.Neighbors(V)[i]);
                    int pointer = city_ref.IndexOf(graph.Neighbors(V)[i]);
                    previous[pointer] = city_ref.IndexOf(V);
                }

                stack.Push(previous);
                Visited.Enqueue(V);
            }

        }

        int path_val = city_ref.IndexOf(dest);
        while(stack.Count != 0)
        {
            int[] i = stack.Pop();

            for (int p = 0; p < i.Length; p++)
            {
                if (i[p] == path_val)
                {
                    path.Add(city_ref[i[p]]);
                    path_val = i[p];
                }
            }

        }
        return path;
    }
公共静态列表最短路径(图形、字符串src、字符串dest)
{
列表路径=新列表();
List city_ref=graph.GetVertices();
已访问队列=新队列();
Queue ToVisit=新队列();
堆栈=新堆栈();
ToVisit.Enqueue(src);
while(ToVisit.Count!=0)
{
字符串V=ToVisit.Dequeue();
如果(包含(V))
;
其他的
{
int[]先前=新int[城市参考计数];
对于(int i=0;i
我建议您从中实现算法。找到从起点到目标的所有路径后,尝试向后遍历,比较节点X与其相邻节点之间的距离。你也可以看看。希望有帮助。

BFS实际上与队列一起工作。您可以查看bfs的任何基本代码以清楚地理解它。堆栈图是以深度优先的方式遍历的,这实际上并不能确保最短路径。哦,对于加权图(所有边的权重都不相同),bfs将不起作用。改用Dijkstra的算法。@实际上,Dijkstra的算法从所选节点查找到所有节点的最短路径;只是想要一条从一对开始到结束的路径,但实际上想法几乎是一样的。现在,我只是忽略了权重。我不认为我可以使用bfs队列来找到最短路径?我如何追踪我去过的地方?