python简单编写迪杰斯特拉(Dijkstra)算法

使用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])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值