狄克斯特拉算法
主要思想是:
1、找出最便宜的节点,在最短时间内前往的节点,建立一个costs图和parents图,也就是出发点到各点的距离和父子节点关系图。
2、根据第一步找得到的节点,找到其邻居节点,更新经过第一步找到点的costs图和已该节点为父节点的parents图。
3、重复以上两个过程,直到图中所有点都已经做过了以上循环。
4、计算最终路径。
# 狄克斯特拉算法适用于有向无环图,不包含负权边
# 用散列表(Python 里面的字典)描述该图
graph = {}
graph['s'] = {}
graph['s']['a'] = 6
graph['s']['b'] = 2
graph['a'] = {}
graph['a']['d'] = 1
graph['b'] = {}
graph['b']['a'] = 3
graph['b']['d'] = 5
graph['d'] = {}
# 用散列表描述花销
infinity = float('+inf')
costs = {}
costs['a'] = 6
costs['b'] = 2
costs['d'] = infinity
# 用散列表来描述父节点
parents = {}
parents['a'] = 's'
parents['b'] = 's'
parents['d'] = None
processed = []
# 找到花销里面最小的节点
def lowest_cost(costs):
smallest = float('inf')
lowest_node = None
for node in costs: # 在python字典里面,node就代表了key,用cost[key]就可以表达key对应的value
cost = costs[node]
if cost < smallest and node not in processed:
smallest = cost
lowest_node = node
return lowest_node
# 更新花销节点和父节点
name = lowest_cost(costs)
print(name)
while name is not None: # 字典里面的key不是空,代表还有节点
for n in graph[name].keys():
new_costs = costs[name] + graph[name][n]# 通过cost['b'] = 2,加上graph['b']['a'] = 3 ,graph['b']['d'] = 5就可以得到新的cost表
if new_costs < costs[n]:
costs[n] = new_costs
parents[n] = name
processed.append(name)
name = lowest_cost(costs)
print(costs)