本章内容:
- 介绍加权图
- 介绍狄克斯特拉算法:计算加权图的最短路径
- 介绍“环”
使用狄克斯特拉算法
狄克斯特拉算法包含4个步骤:
- 找出最短时间内到达的节点
- 更新该节点的邻点权重
- 重复1,2直到对所有的节点都采取以上步骤
- 计算最终路径(找到到每个点的最短耗时)
术语
加权图
环
无向图中,每条边就是一个环。狄克斯特拉算法只适用于有向无环图。(DAG)
换钢琴
第一步:找到最近节点,海报。找出图中最便宜的节点,并确保没有到该节点的更便宜的路径!
第二步:计算该节点前往各个邻居的开销
列出父节点,最后根据父节点倒推路径。
负权边
负权变不能用狄克斯特拉算法。只能用Bellman-Ford算法实现。
实现
依然以该图为例
需要三个散列表来记录:
graph={}#记录权重
costs={}#更新
parents={}#更新
graph['start']={}
graph['start']['A']=6
graph['start']['B']=2
graph['A']={}
graph['A']['end']=1
graph['B']={}
graph['B']['A']=3
graph['B']['end']=5
graph['end']={}
processed=[]#记录处理过的节点
def find_lowest_cost_node(costs):
lowest_cost=float("inf")
lowest_cost_node=None
for node in costs:
cost=costs[node]
if cost<lowest_cost and node not in processed:
lowest_cost=cost#更新
lowest_cost_node=node
return lowest_cost_node
costs['A']=6
costs['B']=2
costs['end']=float("inf")
node=find_lowest_cost_node(costs)#找出未处理点中最小开销的点
while node is not None:
cost=costs[node]
neighbors=graph[node]
for n in neighbors.keys():
new_cost=cost+neighbors[n]
if costs[n]>new_cost:
costs[n]=new_cost
parents[n]=node
processed.append(node)
node=find_lowest_cost_node(costs)
costs
parents