Python-Dijkstra的算法实现
最近参加比赛要开始积累一些python的算法的代码实现,但是想从网上看看有没有比较合适优化的一些算法,由于博主本人比较菜鸡,所以感觉网上给出的代码比较复杂,由此决定自己来写一份关于python的一些经典算法的实现方式。
如果有待改进的地方,还请各位斧正。
代码实现: #数据结构使用了邻接矩阵matrix
def Dijkstra(matrix,n,Maxline): #matrix[x][y]表示:点x到点y的权值
dst=list(Maxline for i in range(n)) #定义初始点均不可到达[m,m,m......m]
dst[0]=0
comp={0}#定义已经取出的集合,已经包括初始点0,{0}
uncomp={i+1 for i in range(n-1)}
while ((not uncomp)!=True): #uncomp集合非空
list_uncomp=list(uncomp) #将集合uncomp转换成列表进行索引操作
list_comp=list(comp)#将集合comp转换成列表进行索引操作
Min=Maxline
for i in range(len(list_uncomp)):
v_point=list_uncomp[i] #假设要取的在集合uncomp的点
for j in range(len(list_comp)):
uv_point=list_comp[j] #取出已知集合comp的一个点
if(matrix[v_point][uv_point]<Min):
Min=matrix[v_point][uv_point]
get_point=v_point #拟定要从uncomp取出的点
ready_point=uv_point #拟定要从comp取出的点
elif(matrix[uv_point][v_point]<Min):
Min=matrix[uv_point][v_point]
get_point=v_point #拟定要从uncomp取出的点
ready_point=uv_point #拟定要从comp取出的点
uncomp=set(list_uncomp) #将列表list_uncomp转换成集合uncomp
uncomp.remove(get_point)
comp.add(get_point)
dst[get_point]=dst[uv_point]+Min #赋予到达get_point的距离
#跑完集合uncomp
return dst
find=Dijkstra([[999,10,5,999],[999,999,3,999],[999,4,999,1],[999,2,999,999]],4,999)
print(find)
原创