最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(Python)

来源:互联网 发布:mysql中timestampdiff 编辑:程序博客网 时间:2024/05/17 01:32

December 18, 2015 12:56 PM
Dijkstra(迪杰斯特拉)算法是典型的最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。

初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。

#Dijkstra.py#王渊#2015.12.17#Email:wyxidian@gmail.comfrom pylab import *INFINITY = 65535                        #代表无穷大vexs = array([[0,10,INFINITY,INFINITY,INFINITY,11,INFINITY,INFINITY,INFINITY],#邻接矩阵        [10,0,18,INFINITY,INFINITY,INFINITY,16,INFINITY,12],        [INFINITY,18,0,22,INFINITY,INFINITY,INFINITY,INFINITY,8],        [INFINITY,INFINITY,22,0,20,INFINITY,INFINITY,16,21],        [INFINITY,INFINITY,INFINITY,20,0,26,INFINITY,7,INFINITY],        [11,INFINITY,INFINITY,INFINITY,26,0,17,INFINITY,INFINITY],        [INFINITY,16,INFINITY,24,INFINITY,17,0,19,INFINITY],        [INFINITY,INFINITY,INFINITY,16,7,INFINITY,19,0,INFINITY],        [INFINITY,12,8,21,INFINITY,INFINITY,INFINITY,INFINITY,0]])lengthVex = len(vexs)                   #邻接矩阵大小adjvex = zeros(lengthVex)               #连通分量,初始只有第一个顶点,当全部元素为1后,说明连通分量已经包含所有顶点adjvex[0] = 1;lowCost = vexs[0,:]                     #记录与连通分量连接的顶点的最小权值,初始化为与第一个顶点连接的顶点权值lowCost[0] = 0lastLowCost = ones(lengthVex)*INFINITYlastLowCost[0] = 0count = 0path = [INFINITY]*lengthVexI = 0while (count<lengthVex):    lastI = I    I = (argsort(lowCost))[count]    print("Vertex   [",count,"]:",I)    adjvex[I] = lowCost[I]    print("Edge [",count,"]:",adjvex[I])    lowCost = array(list(map(lambda x,y:x if x<y else y,lowCost,vexs[I,:])))    flag = list(map(lambda x,y: x==y, lowCost,lastLowCost))    flag[I] = True    print(flag)    path = list(map(lambda x,y,z:y if x else z,flag,path,list([I])*lengthVex))    print(path)    lastLowCost = lowCost    count = count+1minPath = []temp = 4while path[temp]<INFINITY:    minPath.append([temp,path[temp]])    temp = path[temp]print(minPath)

最后给出两道题目练手,都是直接套用模版就OK的:
1.HDOJ 1874 畅通工程续
http://www.wutianqi.com/?p=1894

2.HDOJ 2544 最短路
http://www.wutianqi.com/?p=1892

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 皮肤起小水泡痒怎么办 手臂起小水泡痒怎么办 手背有小水泡痒怎么办 水泡破了很痒怎么办 有一块牙龈肿了怎么办 耳前瘘管有脓怎么办 睡歪脖子很痛怎么办 睡歪脖子怎么办小妙招 睡觉睡得脖子疼怎么办 睡久了后脑勺疼怎么办 腮帮肿了但不疼怎么办 吃硬东西腮帮痛怎么办 嘴巴长开旁边疼怎么办 晚上腿酸睡不着觉怎么办 吃酸的牙齿酸软怎么办 吃酸东西牙齿酸怎么办 拔完智齿神经疼怎么办 22岁腿关节疼痛怎么办 耳洞里面有硬块怎么办 耳洞发炎有硬块怎么办 小孩慢性扁桃体发炎怎么办大全 侧切伤口化脓了怎么办 狗狗伤口不愈合怎么办 狗后腿烂了化脓怎么办 乳腺增生腋下淋巴结肿大怎么办 手术刀口冒脓了怎么办 脚伤口感染肿了怎么办 皮外伤口不愈合怎么办 烫伤新皮红红的怎么办 脸上痘痘化脓了怎么办 痘痘引起的红肿怎么办 痘痘引起的硬块怎么办 痘痘化脓感染了怎么办 烫伤有脓了烂掉怎么办 烫伤起泡破皮了怎么办 一出汗就有狐臭怎么办 耳朵后面臭臭的怎么办 赤黑abo意外怀孕怎么办 qq忘记密保了怎么办 三星s8耗电太快怎么办 360云盘关闭照片怎么办