首页 > 编程语言 >狄克斯特拉算法实现

狄克斯特拉算法实现

时间:2022-12-13 11:05:33浏览次数:55  
标签:node lowest 狄克 graph costs 算法 cost 斯特拉 fin

最近学习《算法图解》,记录一下自己默写的狄克斯特拉算法,该算法用Python书写。

graph = {}
infinity = float('inf')

graph['start'] = {}
graph['start']['a'] = 5
graph['start']['b'] = 2

graph['a'] = {}
graph['a']['c'] = 4
graph['a']['d'] = 2

graph['b'] = {}
graph['b']['a'] = 8
graph['b']['d'] = 7

graph['c'] = {}
graph['c']['fin'] = 3
graph['c']['d'] = 6

graph['d'] = {}
graph['d']['fin'] = 1

graph['fin'] = {}

costs = {}
costs['a'] = 5
costs['b'] = 2
costs['c'] = infinity
costs['d'] = infinity
costs['fin'] = infinity

parents = {}
parents['a'] = 'start'
parents['b'] = 'start'
parents['c'] = None
parents['d'] = None
parents['fin'] = None

processed = []

def find_lowest_cost_node(costs):
lowest_cost = infinity
lowest_cost_node = None
for node in costs:
if costs[node] < lowest_cost and node not in processed:
lowest_cost = costs[node]
lowest_cost_node = node
return lowest_cost_node

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 new_cost < costs[n]:
costs[n] = new_cost
parents[n] = node
processed.append(node)
node = find_lowest_cost_node(costs)

print(parents)

arr = []

key = parents['fin']

while key != 'start':
arr.append(key)
key = parents[key]

arr.reverse()
print('最短路径为:start',end='')
for i in arr:
print('-'+i,end='')
print('-fin')
print('最短路径的花费为:' + str(costs['fin']))

狄克斯特拉算法只可用于获取有向无环图(加权图)的最短路径,且图内不能有负权边。

图内有负权边需要使用贝尔曼-福德算法,无权图则用广度优先搜索(Breadth First Search)算法可得出最短路径。

 



标签:node,lowest,狄克,graph,costs,算法,cost,斯特拉,fin
From: https://blog.51cto.com/u_15686949/5933138

相关文章

  • 对前端数据结构与算法的研究----------------引用
         1.递归      递归就是自己调自己,递归在前端里面算是一种比较常用的算法。假设现在有一堆数据要处理,要实现上一次请求完成了,才能去调下一个请求。一......
  • 算法:计算盛最多水的容量
    题目:给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多......
  • 限流算法
    1.为什么要限流系统上游流量未知,如果超载引起雪崩。系统下游吞吐能力一般,直连带宽有限。2.常见的几种限流算法 1.计数器限流  在一段时间间隔内,对请求进行......
  • 一文带你入木三分地理解字符串KMP算法(next指针解法)
    1.KMP算法简介温馨提示:在通篇阅读完并理解后再看简介效果更佳以下简介由百度百科提供https://baike.baidu.com/item/KMP%E7%AE%97%E6%B3%95/10951804:KMP算法是一种改......
  • 算法第五章
    1.1对于该题样例n=3,m=3,解空间为(1,1,1),(1,1,2),(1,1,3),(1,2,1),(1,2,2),(1,2,3),(1,3,1),(1,3,2),(1,3,3)(2,1,1),(2,1,2),(2,1,3......
  • Java实现LRU算法
    文章目录1、内存空间有限,当缓存满的时候,如何淘汰缓存?2、实现LRUdemo使用Java容器LinkedHashMap哈希表(HashMap)+双向链表 1、内存空间有限,当缓存满的时候,如何淘汰缓......
  • 【数据结构-树】二叉树的相关算法
    目录1计算二叉树中双分支结点的个数2交换二叉树中所有左右子树3求先序遍历第k个元素4删去值为x的子树5计算二叉树的带权路径长度(WPL)6将表达式树转化为等价的中缀......
  • 温州大学《深度学习》课程课件(六、优化算法)
    这学期我上的另一门课是本科生的《深度学习》,主要用的是吴恩达老师的《深度学习》视频课的内容。使用教材:吴恩达《深度学习》课程笔记课外参考书:《深度学习》,人民邮电出版社......
  • 基础算法学习笔记
    #笔记-基础算法快速排序将序列按从小到大或从大到小顺序排序。时间复杂度\(O(nlogn)\),不稳定。步骤确定分界点\(x\):\(q[l]\)、\(q[(l+r)\div2]\),\(q[r]\)、\(......
  • 算法基础课
    给定一个字符串SS,以及一个模式串PP,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串PP在字符串SS中多次作为子串出现。求出模式串PP在字符串SS中所有......