乐谱

加权图与狄克斯特拉算法|Python实现

丶灬走出姿态 提交于 2020-02-14 20:16:21
在前面,我们讨论了图与广度优先搜索,解决了一个“找朋友”的问题。现在,让我们想一想,我们把问题换成了“找地方”——我们想从一个地方到达另一个地方,也按照最短路径到达——这样的问题中,我们使用图来建立模型时,会发现连接——也就是两个地方之间的路——是有权重,或者说长度的。这种情况下,广度优先搜索就不起作用了——它只能保证我们找到走过最少的连接数,而没有考虑这些连接有长度的情况。下面我们来考虑这个问题。 1. 两个术语 (1).加权图 就像上面所说,广度优先搜索适用于“连接没有长度值”的图,我们称之为非加权图。而连接存在长度值时,我们使用狄克斯特拉算法,此时的图称为加权图,连接的长度值称为权重。比如: 6 1 2 5 3 起点 A 终点 B (2).有向无环图 之前我们介绍过有向图和无向图,其实无向图就是一个环: 起点 终点 也就是无向意味着两个节点相互指向对方。 当环这个结构存在于图中,并且终点不在环中时,环只会徒劳的增加权重。我们要讨论的狄克斯特拉算法适用于有向无环图( DAG )。 2. 狄克斯特拉算法 前面示例展示的那个图过于简单,无法体现这个算法的所有细节。所以,这里我们搭建一个复杂一点的图,并且解释这个图的现实意义——这会让我们发现狄克斯特拉算法的用处之大。 5 0 15 20 30 35 20 10 乐谱 唱片 海报 吉他 鼓 钢琴 这里,节点的意思很明确:某件乐器