2021 蓝桥杯 省赛B组 D题:路径 python解法
from math import *
def zuixaiogongbeishu(i,j):
best = 0
for m in range(1,int(min(i,j))+1):
if i%m==0 and j%m==0:
if best<m : best = m
return i*j/best
n=2021
inf = 10**10
distance = list()
for i in range(n):
distance.append([])
for j in range(n):
if abs(i-j)>23:
distance[i].append(inf)
else:
distance[i].append(int(zuixaiogongbeishu(i+1,j+1)))
#对于图论中两点的最近距离,采用迪杰斯特拉算法进行求解
#迪杰斯特拉算法适用于“边”的权值为正的图论题目
#1,首先需要构建点距离矩阵,权值已根据题目描述构建见列表distance
#2,使用used 赋值True 或者False区分点的使用与否
used = [False]*2021
#3,设置列表mindis表示起点到各个点(包括自身)的最小距离
mindis = [inf]*2021
#s为第s-1个点
def dijkstra(s):
mindis[s] = 0
while True:
#v设置为哨兵,对包含起点s的所有点统一处理
v = -1
#在从未使用过的点(标注为False的位置)中选择一个距离最小的定点
for u in range(n):
if not used[u] and ( v == -1 or mindis[u] < mindis[v] ):
v = u
if v == -1:
#说明所有点都被使用过或者跨越过,结束循环
break
#将选定的点标记为True
used[v] = True
#更新标记为False的个点到起点s的距离
#之所以更新标记为False的点中中顶点的距离,
#是由于上一步中确定了k是求出最短路径的顶点,
#从而可以利用k来更新其它顶点的距离;
# 例如,(s,v)的距离可能大于(s,k)+(k,v)的距离。
for u in range(n):
mindis[u] = min(mindis[u],mindis[v]+distance[u][v])
dijkstra(0)
print(mindis[-1])
运行结果为9091900与官方解答10266837不同请各位大佬指点