贪心算法-单源最短路径

单源最短路径

问题

  • 给定一个带权有向图,选中一个结点称为源点,计算源点到其他结点的最短路径长度。

解题步骤

  • 给定一个集合S,初始化S={ s },s表示源点,S中的点表示已经找到了从u(u属于V)到s的最短路径。当S=V的时候,即S包含所有结点的时候算法结束,即已经找到了s(源点)到其他所有点的最短路径。

  • 从s到u相对于S的最短路径:从s到u且只经过S中的点的最短路径。

  • dist[u]:从s到u相对S的最短路径长度。

  • short[u]:从s到u的最短路径长度。

  • short[u] <= dist[u]

    • 因为s到u如果不经过S中的点,即没有路径从s到u,此时最短路径长度为无穷大。而short[u]中s到u没有S限制。
    • 当2者相等的时候,即S中已经包含了所有结点时,算法结束。

贪心算法-单源最短路径

算法设计思想

贪心算法-单源最短路径

实例演示

贪心算法-单源最短路径

  • 如图所示,一开始S中只有源点,dist[1] = 0 表示只经过S中的点从1(s:源点)到1 (u:其他点)的最短路径长度为0。再如dist[2] = 10 表示从1到2,且只经过S中的点的最短路径长度为10。dist[3] = 无穷大,因为从1到3需要经过S中不存在的点。
  • 计算出所有dist后选择最小的,即dist[6] = 3 ,把点6加入S中。

贪心算法-单源最短路径

  • 然后更新dist,dist[2]更新为5,从1-6-2路径长度为5 < 1-2路径长度10。
  • 计算好dist后选出最小的dist[5],把5放进S中,以此类推。
  • 当所有结点都在S中时,算法结束,此时dist = short,short[u]即为s到u的最短路径长度。
    贪心算法-单源最短路径