最短路径算法的实现(dijskstra):Python
dijskstra最短路径算法步骤:
输入:图G=(V(G),E(G))有一个源顶点S和一个汇顶点t,以及对所有的边ij属于E(G)的非负边长出cij。
输出:G从s到t的最短路径的长度。
第0步:从对每个顶点做临时标记L开始,做法如下:L(s)=0,且对除s外所有的顶点L(i)=∞。
第1步:找带有最小临时标记的顶点(如果有结,随机地取一个),使得该标记变成永久标记,意该标记永久不再改变。
第2步:对没有永久标记但是又与带永久标记的顶点相邻的顶点j,按如下方法计算一个新的临时标记:L(j)=min(L(i)+cij),求最小是对所有带永久标记的顶点i做的,重复1和2,知道所有的顶点都打上永久标记。
时间复杂度:O(n^2)
python代码如下
__author__='wym'
#coding=cp936
class Algorithm():
point_list=[]
edge_list=[]
def dijkstra(self,start_point,point_list,edge_list):
'''
@point为起始点
@point_list为顶点列表
@edge_list为边列表
'''
#列表点
temp_point=[]
#起始点,在列表点中的位置
point_index=point_list.index(start_point)
#初始点到其余各点的距离字典
dis_dic=dict()
#边列表的首端点列表
temp_edge=[]
#距离初始化
dis_list=['inf']*len(point_list)
temp_point.append(start_point)
dis_list[point_index]=0
for i in range(len(point_list)):
dis_dic.setdefault(point_list[i],dis_list[i])
for i in range(len(edge_list)):
temp_edge.append(edge_list[i][0])
point=start_point
#依次遍历加入最小距离的点,并更新原列表中点的距离
while len(temp_point)<len(point_list):
index=self.find_index(point,temp_edge,edge_list,temp_point)
#判断是否走的通
if len(index)>0:
value=edge_list[index[0]][2]
add_index=index[0]
for i in index:
if edge_list[i][0] in dis_dic:
dis_dic[edge_list[i][1]]=min(float(edge_list[i][2])+float(dis_dic[point]),float(dis_dic[edge_list[i][1]]))
if value>edge_list[i][2]:
value=edge_list[i][2]
add_index=i
temp_point.append(edge_list[add_index][1])
point=edge_list[add_index][1]
else:
point=in_list[in_list.index(point)-1]
print dis_dic
return dis_dic
def find_index(self,point,temp_edge,edge_list,temp_point):
'''
@point:遍历点基准点
@temp_edge:边列表的首端点列表
@edge_list:边权列表
@temp_point:列表点
@返回边权列表列表索引
'''
#寻找点的索引,并去除已在列表中的点
index=[]
for i in range(len(temp_edge)):
if point==temp_edge[i] and edge_list[i][1] not in temp_point:
index.append(i)
return index if __name__=="__main__":
print '请输入无向图的顶点'
point_list=input()
print '请输入无向图的边'
edge_list=list(input())
print '请输入各边长度'
for i in range(len(edge_list)):
print '顶点'+str(edge_list[i][0])+'顶点'+str(edge_list[i][1])+'的长度为:'
length=[input("长度为:")]
edge_list[i]+=length
edge_list.append([edge_list[i][1],edge_list[i][0],length[0]])
while True:
print '请输入起始点'
start_point=input("start_point=")
if start_point in point_list:
obj=Algorithm()
obj.dijkstra(start_point,point_list,edge_list)
break
else:
print '该点不在图中,请重新输入:'
continue
运行结果:
请输入无向图的顶点
1,2,3,4,5,6
请输入无向图的边
[1,6],[1,3],[1,2],[2,3],[3,6],[2,4],[3,4],[4,5],[5,6]
请输入各边长度
顶点1顶点6的长度为:
长度为:14
顶点1顶点3的长度为:
长度为:9
顶点1顶点2的长度为:
长度为:7
顶点2顶点3的长度为:
长度为:10
顶点3顶点6的长度为:
长度为:2
顶点2顶点4的长度为:
长度为:15
顶点3顶点4的长度为:
长度为:11
顶点4顶点5的长度为:
长度为:6
顶点5顶点6的长度为:
长度为:9
请输入起始点
start_point=1
{1: 0, 2: 7.0, 3: 9.0, 4: 20.0, 5: 20.0, 6: 11.0}
最短路径算法的实现(dijskstra):Python的更多相关文章
- Python学习(三) 八大排序算法的实现(下)
本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...
- Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。
Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...
- python冒泡排序算法的实现代码
python冒泡排序算法的实现代码 这篇文章主要介绍了python冒泡排序算法的实现代码,大家参考使用 1.算法描述: (1)共循环 n-1 次 (2)每次循环中,如果 前面的数大于后面的数,就交换 ...
- 算法面试题(python)——如何找出数组中出现一次的数
题目描述: 一个数组里,除了三个数是唯一出现的,其余的数都出现了偶数次,找出这三个数中任意一个.比如数组序列为[1,2,4,5,6,4,2],只有1.5.6这三个数字是唯一出现的,数字2.4均出现了偶 ...
- 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练
以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...
- Bug2算法的实现(RobotBASIC环境中仿真)
移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...
- Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...
- java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现
java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...
- SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)
在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...
随机推荐
- 20172329 2018-2019-2 《Java软件结构与数据结构》实验二报告
20172329 2018-2019-2 <Java软件结构与数据结构>实验二报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 王文彬 学号:2017232 ...
- Codeforces Round #182 (Div. 1) B. Yaroslav and Time 最短路
题目链接: http://codeforces.com/problemset/problem/301/B B. Yaroslav and Time time limit per test2 secon ...
- 牛客网国庆集训派对Day5 题目 2018年
链接:https://www.nowcoder.com/acm/contest/205/L来源:牛客网参考博客:https://blog.csdn.net/HTallperson/article/de ...
- Struts1简单开发流程梳理
共享数据的4种范围MVC设计模式JSP model1.JSP model2struts实现MVC机制(ActionServlet.Action)struts-config.xml ActionServ ...
- awk4.0对数组value排序
有朋友问了一个问题,要求对下面这段文本进行处理: http://www.baidu.com/2.html http://www.baidu.com/2.html http://www.baidu.co ...
- Ubuntu安装使用中的一些注意事项
在win7上安装VMware workstations10.0 ,在VMware workstations10.0上安装Ubuntu14.04 64位时,关于网络的连接注意: win7 网络连接里上的 ...
- 计算机网络【1】—— OSI七层协议和TCP/IP四层协议
新开一贴,专门用来记录计算机网络相关知识. 一.OSI七层协议 物理层.数据链路层.网络层.传输层.会话层.表示层.应用层 二.TCP/IP四层协议 网络接口层.网际层.运输层.应用层 三.五层协议 ...
- Java多线程(三) —— 线程并发库之总体架构
对java并发库一直觉得很神秘,决定好好研究一下. 参考文献: https://blog.csdn.net/hp910315/article/details/50963095 http://www.b ...
- 解决MySQL Slave 触发 oom-killer
最近经常有收到MySQL实例类似内存不足的报警信息,登陆到服务器上一看发现MySQL 吃掉了99%的内存,God ! 有时候没有及时处理,内核就会自己帮我们重启下MySQL,然后我们就可以看到 dme ...
- 安装pycharm软件后,打开robot framework怎么默认用pycharm打开
1.打开ride.py的属性,修改打开方式