Algorithm 如果需要在BFS中重新访问访问的节点,时间复杂度是多少?

Algorithm 如果需要在BFS中重新访问访问的节点,时间复杂度是多少?,algorithm,time-complexity,breadth-first-search,Algorithm,Time Complexity,Breadth First Search,我正在研究一个算法问题 为了简化,问题可以简化为: 给定一个m*n矩阵,用一组特殊点,在该矩阵中找到从点a到点B的最优路径。 最佳路径是通过最少特殊点的路径。如果有多条路径具有最少的特殊点,请选择最短的路径。如果仍有多条路径,请在其中随机选择一条 这个问题肯定可以通过BFS解决。要保持队列,请记录每个点的信息。如果找到更好的路径,请更新信息并将此点放入队列。最后在B点输出信息 棘手的部分是一个点可能会被重复多次,我无法估计在这种情况下的时间复杂性。有人能帮我吗?最终目标是不命中任何特殊点或尽可能

我正在研究一个算法问题

为了简化,问题可以简化为:

给定一个m*n矩阵,用一组特殊点,在该矩阵中找到从点a到点B的最优路径。 最佳路径是通过最少特殊点的路径。如果有多条路径具有最少的特殊点,请选择最短的路径。如果仍有多条路径,请在其中随机选择一条

这个问题肯定可以通过BFS解决。要保持队列,请记录每个点的信息。如果找到更好的路径,请更新信息并将此点放入队列。最后在B点输出信息


棘手的部分是一个点可能会被重复多次,我无法估计在这种情况下的时间复杂性。有人能帮我吗?

最终目标是不命中任何特殊点或尽可能少命中。您可以使用Dijkstra进行以下设置:普通边缘成本1。特殊点和所有其他点之间的边缘的成本超过
m*n
(因此,即使你在没有特殊节点的情况下通过整个迷宫,也比只走一步,但通过特殊节点要好)

然后你运行Dijsktra,你就拥有了它。由于图中每个节点的边数最大(其矩阵最多为4个方向),因此边数约为4*m*n,即
O(m*n)


所以你的
V=(m*n)
E=O(m*n)
和Dijkstra是
O(V+E*loge)
。只要把它放在那里,你就会得到O(m*n+m*n*log(m*n))=O(m*n*log(m*n))

是的,你的答案很好,谢谢!所以,如果我不使用Dijkstra,只使用普通队列而不是堆,那么它的复杂性又如何呢?最坏的情况是O(E^2)吗?@Sam,你能帮我回答上面的问题吗?@HanLi-Dijkstra使用最小优先级队列,而不是堆。它基本上是BFS算法,只在有意义的方向上继续。你确定你的“简单”算法真的有效吗?如果你在回溯中使用蛮力,你可以在
O(3^n*m)
中结束(3因为你通常有3条路径要走,所以每一步的可能性比上次大3倍)。这是几乎无法使用的东西