Python实现迪杰斯特拉算法
首先我采用邻接矩阵法来表示图(有向图无向图皆可)
图的定义如下:
class Graph:
def __init__(self, arcs=[]):
self.vexs = []
self.arcs = arcs def creategrapg(self):
self.vexs = input().split()
for i in range(len(self.vexs)):
self.arcs.append([float('inf') if int(v) == 0 else int(v)
for v in input().split()])
其中creategrapg用来创建图,创建图时,首先输入所有顶点,以空格分隔在一行内输入,后面为一个n*n的矩阵,n为顶点数目。
算法具体实现如下:
def ShortestPath_DIJ(self, v):
#迪杰斯特拉算法
v0 = self.vexs.index(v)
n = len(self.vexs)
S = [False] * n
S[v0] = True
D = self.arcs[v0].copy()
Path = [-1] * n
for i in range(n):
if D[i] < float('inf'):
Path[i] = v0
D[v0] = 0
for i in range(1, n):
min_ = float('inf')
for w in range(n):
if not S[w] and D[w] < min_:
v_ = w
min_ = D[w]
S[v_] = True
for w in range(n):
if not S[w] and (D[v_] + self.arcs[v_][w] < D[w]):
D[w] = D[v_] + self.arcs[v_][w]
Path[w] = v_
print(f'从{v}到各顶点的最短路径为:')
# 算法到此其实已经结束,下面我自己写的用来展示路径的部分
for ind, val in enumerate(Path):
if ind == v0:
continue
if val == -1:
print(f'{self.vexs[ind]}:不可到达')
continue
path_ = [self.vexs[ind]]
while val > 0:
path_.append(self.vexs[val])
val = Path[val]
# path_.append(v)
print(self.vexs[ind] + ':' + '->'.join(path_[::-1]))
注:这个函数实际上是写在Graph类里面的,为了方便叙述我才分开放了代码。
运行代码:
mygraph = Graph()
mygraph.creategrapg()
mygraph.ShortestPath_DIJ(mygraph.vexs[1])
输入的图如下图所示。
输入样例为:
v0 v1 v2 v3 v4 v5
0 0 10 0 30 100
0 0 5 0 0 0
0 0 0 50 0 0
0 0 0 20 0 10
0 0 0 0 0 60
0 0 0 0 0 0

运行结果如下:
从v1到各顶点的最短路径为:
v0:不可到达
v2:v1->v2
v3:v1->v2->v3
v4:不可到达
v5:v1->v2->v3->v5
Python实现迪杰斯特拉算法的更多相关文章
- Python完成迪杰斯特拉算法并生成最短路径
def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print("Start Dijstra Path……") path=[ ...
- C#迪杰斯特拉算法
C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 【算法杂谈】LJX的迪杰斯特拉算法报告
迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 迪杰斯特拉算法——PAT 1003
本文主要是将我对于我对于迪杰斯特拉算法的理解写出来,同时通过例题来希望能够加深对于算法的理解,其中有错误的地方希望大家指正. 迪杰斯特拉算法 我将这个算法理解成一个局部到整体的算法,这个方法确实越研究 ...
- dijkstra算法(迪杰斯特拉算法)
dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...
- 迪杰斯特拉算法c语言实现
/*http://1wangxiaobo@163.com 数据结构C语言版 迪杰斯特拉算法 P189 http://1wangxiaobo@163.com 编译环境:Dev-C++ 4.9.9.2 ...
- HDU6166-Senior Pan-Dijkstra迪杰斯特拉算法(添加超源点,超汇点)+二进制划分集合-2017多校Team09
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...
随机推荐
- Vmware虚拟机下不能访问网络的解决办法之一
Vmware虚拟机下不能访问网络的解决办法之一 1.这个是默认的网络设置 2.如果不能访问网络,看下VMware相关的服务有没有打开,win+R 3.找到VMware的相关选项,全部启用(当然网络可能 ...
- 操作句柄Handle(7)
可以将Handle理解成访问对象的一个“句柄”.垃圾回收时对象可能被移动(对象地址发生改变),通过Handle访问对象可以对使用者屏蔽垃圾回收细节. Handle涉及到的相关类的继承关系如下图所示. ...
- Python Ethical Hacking - BACKDOORS(7)
Handling Errors: If the client or server crashes, the connection will be lost. Backdoor crashes if: ...
- [日常摘要] -- 阻塞IO与非阻塞IO篇
NIO操作过程 非阻塞读/写操作 读-- 从通道读取数据到buffer,同时可以继续做别的事情,但数据都到buffer之后,线程再继续处理数据 写-- 一个线程请求写入一些数据到某通道,但不需要等待它 ...
- 题解 洛谷 P2280 【[HNOI2003]激光炸弹】
这道题因为要求价值最大值,所以正方形应尽可能多覆盖目标,因此所得的正方形四个顶点一定在格点上. 经过分析后,我们就可以知道,该题做法就是用二维前缀和进行事前预处理,然后一个一个枚举每个点覆盖到的总价值 ...
- 跟老刘学运维day02~部署虚拟环境安装Linux系统(1)
第1章 部署虚拟环境安装Linux系统 所谓“工欲善其事,必先利其器” 1.准备工具 VmwareWorkStation 15.5——虚拟机软件(必需) RedHatEnterpriseLinux ...
- python的常用模块
一.random随机数模块 使用随机数模块需要导入随机数模块import random 1.random.random() 生成[0,1)之间的随机小数 2.random.randint(a,b) 生 ...
- onepill Android端
使用的框架 第三方登录集成基于ThinkPHP5的第三方登录插件 QQ第三方登录集成QQ互联.qq第三方接入 SharedPreference实现记住账号密码功能参考.参考2
- Python os.ftruncate() 方法
概述 os.ftruncate() 裁剪文件描述符fd对应的文件, 它最大不能超过文件大小.高佣联盟 www.cgewang.com Unix, Windows上可用. 语法 ftruncate()方 ...
- C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享
最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...