最短路径算法的实现(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 ...
随机推荐
- js格式化json字符串和json对象
1,格式化json对象 var json = {"@odata.context":"$metadata#AddTableOne_466281s","v ...
- VS2010中配置OpenGL
下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Bu ...
- 安装AndroidJDK的坑
最近公司要用weex了,先开始搭一下环境,真的都是坑,写下来大家引以为鉴,我踩坑三天的后果. 首先要安装JavaJDK这个过程就不写了都是程序员网上搜索一下很多,注意找论坛上最新的帖子来看,这里有一个 ...
- git的使用(本地及关联远程,上传到远程)
前言:本想这个博客就是用来交作业的,因为作业,学习了git ,现在觉得,既然有这个博客了,就好好用一下吧,也给自己养成个好习惯,就也来记录一下吧,关于git的本地仓库上传,本地与远程的关联,从本地上传 ...
- 四则运算web版
1)在文章开头给出Coding.Net项目地址.(1') https://git.coding.net/meiyoupiqidefan/jieduizuoye.git url测试地址:http://3 ...
- oh my god 四则运算
Week1地址:https://git.coding.net/leiqh549/four.git 需求分析: 1.一个生成n道四则运算的程序,要求数字在0-100间,运算符在3-5个之间且运算符至少包 ...
- mysubmail 短信报警
https://www.mysubmail.com/chs/documents/developer/YPWD84 文本文档 官网:www.mysubmail.com 操作流程:快速接入短信 AP ...
- express入门学习(一)
一.安装express cnpm || npm install express --save ; 1. Hello World var express = require('express'); ...
- Json的JsonValueProcessor方法
将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作. JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml ...
- SecureCRT8.1下载+注册机+破解教程
[下载]下载SecureCRT + SecureFX 8.1 Bundle版本软件,官网下载较麻烦,因此在此提供百度云连接. 链接:http://pan.baidu.com/s/1hsIjtSK 密码 ...