2021 蓝桥杯 省赛B组 D题:路径 python解法

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不同请各位大佬指点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

minokcc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值