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 ...
随机推荐
- 一文读懂对抗生成学习(Generative Adversarial Nets)[GAN]
一文读懂对抗生成学习(Generative Adversarial Nets)[GAN] 0x00 推荐论文 https://arxiv.org/pdf/1406.2661.pdf 0x01什么是ga ...
- 没内鬼,来点干货!SQL优化和诊断
SQL优化与诊断 Explain诊断 Explain各参数的含义如下: 列名 说明 id 执行编号,标识select所属的行.如果在语句中没有子查询或关联查询,只有唯一的select,每行都将显示1. ...
- There are unfinished transactions remaining. Please run yum-complete-transaction as root.
问题:CentOS 运行软件更新时,提示如下错误. 解决办法: 在终端界面,运行 sudo yum-complete-transaction.
- Python 实现邮件发送功能(进阶)
上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题. 本章主要包含知识点: 1. 如何将图片放到邮件主体中发送 2. 如何发送附 ...
- C++语法小记---类型检测
类型检测 C++使用typeid关键字进行类型检查 不同的编译器使用typeid返回的类型名称不严格一致,需要特别注意 也可以使用虚函数,返回各自的类型名 如果typeid的操作数不是类类型(类指针也 ...
- [spring] -- AOP、IOC、DI篇
AOP(面向切面编程) 怎么理解这个切面编程的概念及优点? 概念: 横切关注点与业务逻辑相分离,切面能帮助我们模块化横切关注点: 优点: 现在每个关注点都集中于一个地方,而不是分散到多处代码中: 服务 ...
- CAS实现SSO 单点登录
结构 CAS分为两部分,CAS Server和CAS Client CAS Server用来负责用户的认证工作,就像是把第一次登录用户的一个标识存在这里,以便此用户在其他系统登录时验证其需不需要再次登 ...
- vue学习(六) 事件修饰符 stop prevent capture self once
//html <div id="app"> <div @click="divHandler" style="height:150px ...
- python unicode和string byte
python unicode 和string那 开发过程中总是会碰到string, unicode, ASCII, 中文字符等编码的问题, 每次碰到都要现搜, 很是浪费时间, 于是这次狠下心, 一定要 ...
- 油田问题 bfs
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> #in ...