50行代码python实现Dijkstra单起点最短路径问题小白菜

Dijkstra算法也算是一个入门级别的算法了,这里的代码用来解决单起点最短路径问题中最长的那条路径嗷,其他的原理和正确性证明移步其他qaq,不多说,上代码

在这里插入图片描述
在这里插入图片描述

#Author:BeiZhai
#2020/10/22
#Dijkstra算法,一开始还搞错了呜呜呜

#检测回路
#主要是检测加入一条新的边会不会形成环路,这个时候新的顶点还没加入树里面!!
#dotvist描述顶点中是否被加入了当前的最小生成树,加入了则值为1,否则为0
#adjacent是邻接矩阵,如果邻接的那条边在最小生成树里则为-1,用来告诉函数哪条边已经被加入树里了
#然后函数开始从**x**点开始沿着已经选择的边(即为-1的边)逐步检查有无闭环
#如果检查好了一条边是可以加入的,则从-1改为-2,表示检查过了
def circle(dotVisit,adjacent,x):
    for k in range(n):
        #从x点开始,检测它的所有邻居,如果发现哪条边被选择了,但是连着的另一个顶点还没加到树里
        #(也就是等待着加入的那个顶点啦!),则先标记为-2表示检查过加入这条边也没问题了
        if adjacent[x][k]==-1 & dotVisit[k]==0:
            adjacent[x][k]=-2
            #标记为已加入树里啦,没关系,并不是修改外边那个visit数组
            dotVisit[k]=1
            #x还有其他邻居可能在树里,递归调用下
            return circle(dotVisit,adjacent,k)
        else:
            #发现有闭环
            if adjacent[x][k]==-1 & dotVisit[k]==1:
                return 1
    #全部遍历完了发现正常
    return 0
#例题里的图的邻接矩阵
Inf = float('inf')
Adjacent = [[0, 3, Inf, 7, Inf],
            [3, 0, 4, 2, Inf],
            [Inf, 4, 0, 5, 6],
            [7, 2, 5, 0, 4],
            [Inf, Inf, 6, 4, 0]]

n=5
#标记是否已经被访问过
visit=[0]*n
#从第1个点开始构造树
visit[0]=1
visit_sum=1
min=100000
mindoti=0
mindotj=0
#01324是答案
while(visit_sum!=5):
    min=100000
    mindoti = 0
    mindotj = 0
    for i in range(n):
        if(visit[i]==1):
            for j in range(n):
                #选一个新邻居并且距离是当前所有连接着树的最小的边并且不是连接自己的边(邻接矩阵里到自己距离为0if (visit[j]!=1)& (Adjacent[i][j]<min) & (Adjacent[i][j]!=-1)&(Adjacent[i][j]!=0):
                    temp = Adjacent[i][j]
                    Adjacent[i][j] = -1
                    if (circle(visit, Adjacent, i) != 1):
                        Adjacent[i][j] = temp
                        #存储最小边的信息
                        min = temp
                        mindoti = i
                        mindotj = j
    # print(Adjacent[mindoti][mindotj])
    Adjacent[mindoti][mindotj]=-1
    visit[mindotj]=1
    visit_sum=visit_sum+1
    #依次输出加进来的点,初始点是0(上面说啦)
    print(mindotj)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值