最短路与bfs一点奇怪的思考

      bfs也用于求最短路的问题.但是一般bfs有个限制是边权必须相同.这样才能保证第一次到达此点,此点的距离就是最短距离(即入队的时候最短距离已经确定了)

证明:

      bfs队列里符合单调性和二段性.

      一般用数学归纳法证明.当队列里只有一个点是正确的.假设队列里有n个点,队列与源点距离分布为 x x x...x+1 x+1. 当我们出队队头x时,更新的点的距离为x+1.这样又继续保证了队列的单调性.且更新的点的最短距离一定是x+1.反证法:如果不是,那它只能被队列后面的元素更新,后面元素更新的距离>=x.所以一定为最短距离.

      当距离只有0,1.可以用双端队列bfs.距离0放在队头,距离1放在队尾.但是与一般bfs不同.最短距离是在该点出队时才确定的.因为存在0的边权.当该点出队时,这个点已经将能更新的点更新了,所以没必要再入队.可以用st数组标记.

       最短路问题边权一般不同.此时多用dijkstra,spfa等算法解决.与双端队列相同,最短距离只有在出队的时候才确定.

      

posted @ 2021-04-11 00:10  acmloser  阅读(87)  评论(0编辑  收藏  举报