贪心算法-单源最短路径

单源最短路径

问题

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

解题步骤

  • 给定一个集合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的最短路径长度。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值