[MIT6.006] 15. Single-Source Shortest Paths Problem 单一来源的最短路径问题
首先简单介绍下最大路径问题:给定一个加权图,找到两点之间最短加权路径,本质上就是求两点之间哪条路径的权重和最小。有两种算法去做:Dijkatra和Bellman-Ford,后面几节课会专门讲这两个算法。
下面我们先来看看加权图中是怎么定义最短路径和一些数据结构的概念的:
其实主要就下面两个概念需要注意:
- d(v):点v的当前权重值。
- ∏(v):点v的最佳路径来源点。
(注:在权重图初始化时,除出发点s,其他点的权重都为无穷,只有达到它们后计算相应的权重,他们的当前权重才会改变,而最短路径就是为了找到各点最低的权重值。)
对于权重图中都是正权重来说,比较好找最短路径,但是如果权重图中有负值,可能会出现如下的负循环negative cycles问题,图中S->B其实就应该停止了,但B->D->C是个负循环,为了减低点B的当前权重,传统做法可能会使得最短路径陷入该负循环中,成为S->B->D->C->B->D->C->...(无限循环)。
之后的课讨论怎么解决这个问题,现在先让我们看下如果针对权重图都是正权重下,寻找最短路径的最直观做法是怎样的:
其实就是计算可达到某点的路径权重,如果大了,就进行relax edge操作,直到当前权重小于等于任何其他可达到路径的权重。但是实际中并不会用这种方法,因为它过于繁琐,特别是遇到下面这种指数权重图:
我这里不细讲,大概就是这种指数权重图,一旦放松了某个边,又会牵连其他边的当前权重,导致算法过于复杂。这个问题的关键就是如何挑选合适的边,而不是像上面这种遍历的方式挑选边。合理挑选边的方法主要在于下面的一个道理就是:最短路径的子路就是最短路径。
曼彻斯特大学 数据科学研究生 已毕业
现居地:深圳
兴趣领域:数据挖掘,机器学习及计算机视觉
博客:https://www.cnblogs.com/alvinai/
公众号:zaicode
Github:https://github.com/AlvinAi96
邮箱:alvinai9603@outlook.com
现居地:深圳
兴趣领域:数据挖掘,机器学习及计算机视觉
博客:https://www.cnblogs.com/alvinai/
公众号:zaicode
Github:https://github.com/AlvinAi96
邮箱:alvinai9603@outlook.com

浙公网安备 33010602011771号