1.Dijkstra算法的基本实现 \(O(n^2)\)

简介:

Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

算法介绍推荐文章:

https://www.zhihu.com/question/20630094/answer/758191548

假设有图G:

则G的带权邻接矩阵为:

matrix = [
[99, 2, 99, 6, 99, 9, 99, 99],
[99, 99, 30, 1, 99, 99, 99, 99],
[99, 99, 99, 99, 99, 99, 99, 5],
[99, 99, 99, 99, 2, 99, 99, 99],
[99, 99, 8, 99, 99, 99, 7, 99],
[99, 99, 99, 99, 3, 99, 24, 99],
[99, 99, 99, 99, 99, 99, 99, 21],
[99, 99, 99, 99, 99, 99, 99, 99]]

则时间复杂度为\(O\left( n^2 \right)\)的算法如下图(python语言):

n = len(matrix) # 计算顶点数量

# v记录是否访问
# dis为起始结点到相邻结点的距离
v = [0]*n
dis = matrix[0].copy() # 起始情况
v[0] = 1
dis[0] = 99 # 循环n次
for _ in range(n):
# 找出与集合相邻且距离起点最近的点
k = 0
for j in range(n):
if v[j] == 0 and dis[j] < dis[k]:
k = j
# 该点被访问
v[k] = 1 # 用该点进行松弛(relax)
for j in range(n):
if v[j] == 0 and dis[k] + matrix[k][j] < dis[j]:
dis[j] = dis[k] + matrix[k][j]

结果:

dis = [99, 2, 13, 3, 5, 9, 12, 18]

2.从别的地方抄的虚假的和算法导论格式一样的堆优化实现

class Graph:
def __init__(self):
self.V = []
self.w = {} class Vertex:
def __init__(self, x):
self.key = x
self.color = 'white'
self.d = 10000
self.pi = None
self.adj = [] class Solution():
def InitializeSingleSource(self, G, s):
for v in G.V:
v.d = 10000
v.pi = None
s.d = 0 def Relax(self, u, v, w):
if v.d > u.d + w[(u, v)]:
v.d = u.d + w[(u, v)]
v.pi = u def Dijkstra(self, G, w, s):
self.InitializeSingleSource(G, s)
S = set()
Q = G.V[:]
while Q:
u = self.ExtractMin(Q, S)
S.add(u)
for v in u.adj:
self.Relax(u, v, w) def ExtractMin(self, Q, S):
Q.sort(key=lambda v: v.d)
return Q.pop(0) if __name__ == '__main__':
s = Vertex('s')
t = Vertex('t')
y = Vertex('y')
x = Vertex('x')
z = Vertex('z') s.adj = [t, y]
y.adj = [t, z, x]
t.adj = [x, y]
x.adj = [z]
z.adj = [x, s] G = Graph()
G.V = [s, t, y, x, z]
G.w = {
(s,t):10,
(s,y):5,
(t,y):2,
(y,t):3,
(t,x):1,
(y,z):2,
(x,z):4,
(z,x):6,
(y,x):9,
(z,s):7
} m = Solution()
m.Dijkstra(G, G.w, s) for v in G.V:
if v != s:
print v.key, v.d, v.pi.key
else:
print v.key, v.d, v.pi

Dijkstra算法 python实现的更多相关文章

  1. python代码实现dijkstra算法

    求解从1到6的最短路径. python代码实现:(以A-F代表1-6) # Dijkstra算法需要三张散列表和一个存储列表用于记录处理过的节点,如下: processed = [] def buil ...

  2. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  3. python数据结构与算法——图的最短路径(Dijkstra算法)

    # Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...

  4. 【Python排序搜索基本算法】之Dijkstra算法

    Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的.OSPF动态路由协议就是用的Dijkstra算 ...

  5. python利用dijkstra算法求解图中最短距离

    利用dijkstra算法,来完成图中两个顶点间最短的距离,可以直接复制使用,只需要修改参数即可 def dijkstra_raw(edges, from_node, to_node): "& ...

  6. Dijkstra in python

    下面是一段由python实现的Dijkstra算法,一些地方的处理实在非常棒,相比于C,代码的数量已经缩减到了60行,所以我想通过本文简单的介绍一下这段代码的细节之处,首先给出源程序: from sy ...

  7. 最短路径问题的Dijkstra算法

      问题 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法终于得到一个最短路径树>    ...

  8. dijkstra算法与优先队列

    这是鄙人的第一篇技术博客,作为算法小菜鸟外加轻度写作障碍者,写技术博客也算是对自己的一种挑战和鞭策吧~ 言归正传,什么是dijkstra算法呢? -dijkstra算法是一种解决最短路径问题的简单有效 ...

  9. [算法] Dijkstra算法(带权有向图 最短路径算法)

    一.带权有向图 二.算法原理 1)由于我们的节点是从1-6,所以我们创建的列表或数组都是n+1的长度,index=0的部分不使用,循环范围为1-6(方便计算). 2)循环之前,我们先初始化dis数组和 ...

随机推荐

  1. google protocol buffer——protobuf的问题和改进2

    这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们举例了 ...

  2. 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?

    GitHub 17k Star 的Java工程师成神之路,不来了解一下吗! GitHub 17k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 17k Star 的Java工 ...

  3. ES6 常用总结——第三章(数组、函数、对象的扩展)

    1.1. Array.from() Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结 ...

  4. 趣图:这是拿offer极高的面试经验

      扩展阅读 趣图:面试谈薪资就要这种底气 趣图:IT培训出来找工作 趣图:这是招聘超神级别的程序员?

  5. Flutter集成环信IM,发送图片之后渲染conversation.loadMoreMsgFromDB报path为空

    这时会报错,结果如下: 只需在em_message_body下修改如图path为空即可

  6. Windows10上安装MySQL(详细)

    一.下载MySQL 1.在浏览器里打开mysql的官网http://www.mysql.com 2.进入页面顶部的"Downloads" 3.下滑页面,打开页面底部的"C ...

  7. 吴恩达-机器学习+udacity从机器学习到深度学习

  8. (转)HttpServletResquest对象

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息. 1 ...

  9. Mac Catalina 下 gdb codesign问题解决

    在 macOS 上,无法直接使用 gdb 进行 debug. 这是因为 Darwin 内核在你没有特殊权限的情况下,不允许调试其它进程.调试某个进程,意味着你对这个进程有完全的控制权限,所以为了防止被 ...

  10. 帮你理清React的生命周期

    这是一个从印记中文 | react官方文档提取总结的,算是帮自己理清并且强化记忆React的生命周期,以便以后编写组件的时候能够有更清晰的思路.本文如有纰漏,欢迎指正 整体上来讲,React生命周期分 ...