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. python的运算符及数据类型的转换

    python 目录 python 1.算术运算符 2.比较运算符 3.赋值运算符和复合赋值运算符 4.位运算符 5.逻辑运算符 6.成员运算符 7.身份运算符 8.常见的数据类型转换 1.算术运算符 ...

  2. Docker公共&本地镜像仓库(七)

    分发镜像 我们已经会构建自己的镜像了,那么如果在多个docker主机上使用镜像那?有如下的几种可用的方法: 用相同的Dockerfile在其他host上构建镜像 将镜像上传到公共registry(比如 ...

  3. Centos 7 redis、tomcat、Spring Boot添加开机自启服务

    一.redis添加开机自启 1.添加服务配置文件 [root@test system]# vim /etc/systemd/system/redis-server.service 2.服务配置文件内容 ...

  4. redis并发问题2

    转自https://mp.weixin.qq.com/s?__biz=MzI1NDQ3MjQxNA==&mid=2247485464&idx=1&sn=8d690fc6f878 ...

  5. JAVA之代理2CGLib

    对于CGLib的代理目前还是知道如何使用,以及理论上它的原理,到源码上的理解还没到位 https://www.jianshu.com/p/9a61af393e41?from=timeline& ...

  6. hystrix文档翻译之配置

    Hystrix使用Archaius作为配置的默认实现,下面介绍的是HystrixPropertiesStrategy的默认实现,你也可以通过插件方式重新实现. 每一个配置有四个级别: 全局默认 当下面 ...

  7. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!

    大家都知道okhttp是一款由square公司开源的java版本http客户端工具.实际上,square公司还开源了基于okhttp进一步封装的retrofit工具,用来支持通过接口的方式发起http ...

  8. session深入探讨

    简介 session(会话),其实是一个容易让人误解的词.它总跟web系统的会话挂钩,利用session,javaweb项目实现了登录状态的控制.坊间流传,关闭浏览器,就是关闭了web系统的会话. 其 ...

  9. 基础篇:JVM运行时内存布局

    目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...

  10. spring-boot autoConfiguration

    一, 第一个待注入类 public class CacheService { } public class LoggerService { } 方法一, 实现接口ImportSelectort pub ...