题目:
小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。
小蓝的图由 2021 个结点组成,依次编号 1 至 2021。
对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点 之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条 长度为 a 和 b 的最小公倍数的无向边相连。
例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无 向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。
请计算,结点 1 和结点 2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路:
1.最终一定是递增的,也就是路径一定是从小到大排列(证明不会,呜呜~~~)
2.深入理解Dijiestra,可以认识到只要创建一个列表dist,代表从节点1到各个节点的最短路径。
在这道题目中不需要存一个路径数组。
gcd = lambda a,b:a if b == 0 else gcd(b,a%b)
dist = [float('inf')]*2022
dist[1] = 0
for i in range(1,2022):
for j in range(i+1,min(i+22,2022)):Map[j] = min(dist[j],dist[i]+i*j//gcd(j,i))
print(dist[2021])