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的更多相关文章

  1. Python学习(三) 八大排序算法的实现(下)

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

  2. Python八大算法的实现,插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、基数排序。

    Python八大算法的实现,插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得 ...

  3. python冒泡排序算法的实现代码

    python冒泡排序算法的实现代码 这篇文章主要介绍了python冒泡排序算法的实现代码,大家参考使用 1.算法描述: (1)共循环 n-1 次 (2)每次循环中,如果 前面的数大于后面的数,就交换 ...

  4. 算法面试题(python)——如何找出数组中出现一次的数

    题目描述: 一个数组里,除了三个数是唯一出现的,其余的数都出现了偶数次,找出这三个数中任意一个.比如数组序列为[1,2,4,5,6,4,2],只有1.5.6这三个数字是唯一出现的,数字2.4均出现了偶 ...

  5. 万字长文,以代码的思想去详细讲解yolov3算法的实现原理和训练过程,Visdrone数据集实战训练

    以代码的思想去详细讲解yolov3算法的实现原理和训练过程,并教使用visdrone2019数据集和自己制作数据集两种方式去训练自己的pytorch搭建的yolov3模型,吐血整理万字长文,纯属干货 ...

  6. Bug2算法的实现(RobotBASIC环境中仿真)

    移动机器人智能的一个重要标志就是自主导航,而实现机器人自主导航有个基本要求--避障.之前简单介绍过Bug避障算法,但仅仅了解大致理论而不亲自动手实现一遍很难有深刻的印象,只能说似懂非懂.我不是天才,不 ...

  7. Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.由于数字图像的离散信号, ...

  8. java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现

    java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析 ...

  9. SSE图像算法优化系列十三:超高速BoxBlur算法的实现和优化(Opencv的速度的五倍)

    在SSE图像算法优化系列五:超高速指数模糊算法的实现和优化(10000*10000在100ms左右实现) 一文中,我曾经说过优化后的ExpBlur比BoxBlur还要快,那个时候我比较的BoxBlur ...

随机推荐

  1. 面向对象OO第15次作业总结

    面向对象OO第15次作业总结 1.论述测试与正确性论证的效果差异,比较其优缺点测试通过大量测试数据来覆盖测试代码,比较直观,优点在于知道测的是啥,特别直观,缺点在于很难覆盖所有情况.正确性论证从逻辑关 ...

  2. 20145214 《网络对抗技术》 MSF基础应用

    20145214 <网络对抗技术> MSF基础应用 1.实验后回答问题--用自己的话解释什么是exploit,payload,encode 如果把MSF比作一把枪的话,payload应该是 ...

  3. HDU 4745 Two Rabbits 区间dp_回文序列

    题目链接: http://blog.csdn.net/scnu_jiechao/article/details/11759333 Two Rabbits Time Limit: 10000/5000 ...

  4. 如何在mvc项目中使用apiController

    文章地址:How do you route from an MVC project to an MVC ApiController in another project? 文章地址:How to Us ...

  5. DPDK网卡绑定

    进入DPDK目录编译环境 # cd ~/DPDK/usertools # ./dpdk-setup.py 注意,setup脚本需要在root权限下运行,并且每次重启电脑,都需要重新插入模块和绑定网卡. ...

  6. selenium获取新页面标签页(只弹出一个新页面的切换)

    selenium获取新页面标签页(只弹出一个新页面的切换) windows = driver.current_window_handle #定位当前页面句柄 all_handles = driver. ...

  7. php $_SERVER['HTTP_USER_AGENT']

    //获取浏览器 function getBrowse() { global $_SERVER; $Agent = $_SERVER['HTTP_USER_AGENT']; $browseinfo='' ...

  8. NodeJs 遍历文件夹内容 上传到服务器.并输出上传记录文件

    var path = require('path'); var glob = require('glob') var fs = require('fs'); var Promise = require ...

  9. hdu 4686 Arc of Dream(矩阵快速幂)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意: 其中a0 = A0ai = ai-1*AX+AYb0 = B0bi = bi-1*BX+BY ...

  10. centos6.7 安装JDK

      1.卸载JDK 查看系统是否已安装JDK.一般的linux都默认使用了开源的openJDK.显示JDK版本信息,已经安装JDK,否则没有安装.命令行: [root@localhost ~]# ja ...