使用pycharm
这此编写没有引用库文件,完全是初学者能够看的懂的代码
文中部分图来自《啊哈!算法》啊哈磊 著
对书中的Dijkstra算法思想使用python来实现
有权图:
二维数组:
输入的数据:
再输入开始的顶点后,输出结果
num_inf = 99999999 #定义一个无穷大的数
num_ding = int(input("输入顶点的数量:"))
num_bian = int(input("输入边的数量:"))
num_a = num_ding + 1
s = 0
num_min = 0
#定义一个类似二维数组的列表
list_e = [[0]*num_a for i in range(num_a)]
#定义一个用来存放距离长度的列表
list_dis = [0]
#定义一个存放标志的列表,例如list_sign[2]=1,则表示2号顶点已经松弛过
list_sign = [0]
#初始化列表
i = 1
while i <= num_ding:
j = 1
while j <= num_ding:
if i==j :
list_e[i][j] = 0
else:
list_e[i][j] = num_inf;
j +=1
i +=1
#写入每条边的长度
i = 1
while i <= num_bian:
print("输入俩个顶点的代号,并输入这俩个顶点之间的边长")
d1 = int(input("顶点a:"))
d2 = int(input("顶点b:"))
list_e[d1][d2] = int(input("边长:"))
i += 1
num_start=int(input("输入开始的顶点"))
#将开始顶点到其他各个顶点的初始距离写入list_dis中
q = 1
while q <= num_ding:
list_dis.append(list_e[num_start][q])
q += 1
#初始化标志列表
q = 1
while q <= num_ding:
list_sign.append(0)
q += 1
list_sign[1] = 1 #开始顶点不用松弛
i = 1
while i < num_ding:
num_min = num_inf
#排除已经松弛过的顶点并找到离开始顶点最近的顶点
y = 1
while y <= num_ding :
if list_sign[y]==0 and list_dis[y] < num_min :
num_min = list_dis[y]
s = y
y += 1
#将此时离开始顶点最近的顶点在标志列表list_sign中的数值改为1,代表已经松弛过
list_sign[s] = 1
#松弛过程
k = 1
while k <= num_ding :
# 判断s号顶点和k号顶点之间是否有边长
if list_e[s][k] < num_inf :
#list_dis[k]表示1号顶点到k号顶点的距离
#list_dis[s] + list_e[s][k]表示开始顶点到s号顶点的最短距离加上s号顶点和k号顶点之间的边长
#进行比较,取小的
if list_dis[k] > list_dis[s] + list_e[s][k]:
list_dis[k] = list_dis[s] + list_e[s][k]
k += 1
i += 1
#输出结果,结果是开始顶点到各个顶点的最短距离
print(list_dis[1:num_a])