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):
#选一个新邻居并且距离是当前所有连接着树的最小的边并且不是连接自己的边(邻接矩阵里到自己距离为0)
if (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)