BFS用于找到每个边的权值是一样的图的最短路径,如果图中每个边的权值不一样了,就用到了UCS。

参考了https://blog.csdn.net/jdh99/article/details/80872364

算法思路:

1.数据结构

frontier: 优先队列,用来存储到达当前顶点花费的代价,这里的代价是目前最小的代价,后面如果有到达该点的更短路径,则更新这个代价。探索点的时候,每次都从这个优先队列里面挑出那个代价最小的点,然后扩展该点。

explored:用一个数组来存储就行,存放的是已经探索过的点。

father:数组,用来存储当前点的父节点是谁,以便用于找到这个路径,如果不需要求路径,只需要最短路径的长度,就用不到这个father数组

2. 算法流程

(1)将起始点加入到frontier中,将与frontier相连的点进行探索,每个点的代价(后面用cost替代)是从起点到该点的距离,然后将所有的点加入到frontier里面

(2) 从frontier里面挑出cost最小的点A,判断该点是不是终点,如果是终点算法结束。如果不是终点,探索与该点相连的所有点,每个点的cost是A点的cost加上A点到B点的路径的权重。如果B点是已经出现在frontier里面了,比较一下原来的cost与新生成的cost哪个更小,然后将最小的cost赋值给B点,并更新它的父节点。

(3) 如果frontier为空还没有找到终点,则没有到达终点的最短路径

3. example

  • 将A点加入到frontier里面
  • 从frontier里面将A点拿出来放到explored里面,判断一下A点是不是终点(这里的终点是C点),这里不是,然后探索与A相连的点。A点到D点的cost是A点的cos(起始点的cost为0)加上A点到D点的权重,一共是2,也就是说D点的cost为2,同理B点的cost为3,将D点与B点加入到frontier里面。
  • 从frontier里面找出cost最小的点,这里是D点,将D点放到explore里面,然后探索D点,方法与上一步一样。将C点加入到frontier里面,这里C点的cost是8,虽然我们已经找到了终点,但是这条路径可能不是最优的,所以需要继续探索其他路径。直到我们在frontier里面找到了终点,且终点是frontier里面cost最小的点,那么此时终点的cost才是最小的cost,我们找到最短路径,然后结束算法。 
  • 从frontier里面找cost最小的点,这里是B点,将B点放到explored里面,然后将E点加入到frontier里面
  • 从frontier里面找cost最小的点E,将E放入到explored里面,此时C点为cost花费最小的点,此时有个问题,因为C点已经在frontier里面了,所有这里就用到了上面提到的更新节点的cost,比较一下新生的cost与原来的cost那个更小,原来是8,现在是7,现在更小,所以更新C点的cost为7
  • 从frontier里面找cost最小的点,这里是C点,且C点是我们要找的终点,到此算法结束,我们找到最短路径,值为7
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐